硬汉嵌入式论坛

 找回密码
 立即注册
查看: 826|回复: 1
收起左侧

[STM32H7] stm32H7+W5500发送数据异常

[复制链接]

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2024-6-28 16:10:46 | 显示全部楼层 |阅读模式

是这样的,我用W5500发送ADC采集的数据发送到PC端,ADC采集之后用DMA把数据放到缓冲区了,但是用socket发送的时候就不行了,我用TCP和UDP都测试了,接收到的数据我感觉不对,我不知道异常在哪?请求大佬指导。 STM32H750_W5500_DMA SPI2-PLL6.27-UDP.7z (23.67 MB, 下载次数: 8) 我附上了我的源文件(因为ZIP压缩的文件不支持上传,于是我压缩成7Z的了)


这是我的部分函数:#define ADC_DATA_LENGTH  1024  //定义采集数据长度为2048
uint32_t g_adc3_dma_data1[ADC_DATA_LENGTH];//定义adc3采集数据存放数组
uint8_t g_adc3_dma_complete_flag = 0;//adc3数据dma采集完成标志,在dma采集完成回调函数设置
//ADC回调函数,ADC采集完成后进入回调函数
//adc端口号
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{       
        if(hadc->Instance==ADC3)
        {
               
                g_adc3_dma_complete_flag = 1;//采集完成标志
               
                HAL_ADC_Stop_DMA(&hadc3);
        }
}

int main(void)
{
        HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART6_UART_Init();
  MX_ADC3_Init();
  MX_TIM6_Init();
  MX_SPI2_Init();
  HAL_ADC_Start_DMA(&hadc3,g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
        HAL_Delay(1000);

       
        gpio_for_w5500_config();                                                /*初始化MCU相关引脚*/
        reset_w5500();                                                                                        /*硬复位W5500*/
        set_w5500_mac();                                                                                /*配置MAC地址*/
  socket_buf_init(txsize, rxsize);                /*初始化8个Socket的发送接收缓存大小*/
  IP_AutoSet(3500);

ADC的配置:ADC的时钟我已经给的很低了,好像是20M
hadc3.Instance = ADC3;
  hadc3.Init.Resolution = ADC_RESOLUTION_8B;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = ENABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
ADC的dma配置:

  hdma_adc3.Instance = DMA1_Stream2;
    hdma_adc3.Init.Request = DMA_REQUEST_ADC3;
    hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_adc3.Init.Mode = DMA_NORMAL;
    hdma_adc3.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
SPI的配置:hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 0x0;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
  hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;


SPIdma的配置:

hdma_spi2_rx.Instance = DMA1_Stream0;
    hdma_spi2_rx.Init.Request = DMA_REQUEST_SPI2_RX;
    hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_spi2_rx.Init.Mode = DMA_NORMAL;
    hdma_spi2_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_spi2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;




hdma_spi2_tx.Instance = DMA1_Stream1;
    hdma_spi2_tx.Init.Request = DMA_REQUEST_SPI2_TX;
    hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_spi2_tx.Init.Mode = DMA_NORMAL;
    hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;


最后是发送的函数:

void do_udp(void)
{
//         uint16 len=0;
        switch(getSn_SR(SOCK_UDPS))                                // 获取socket0的状态
                {
                        case SOCK_CLOSED:       
                                socket(SOCK_UDPS,Sn_MR_UDP,remote_port,Sn_MR_MC );
                                break;

                        case SOCK_UDP:                                                                // Socket处于初始化完成(打开)状态
                                        if(getSn_IR(SOCK_UDPS) & Sn_IR_RECV)
                                        {
                                                setSn_IR(SOCK_UDPS, Sn_IR_RECV);                        // Sn_IR的RECV位置1
                                        }
                        if( g_adc3_dma_complete_flag == 1) {
                                uint16_t sent_length = sendto(SOCK_UDPS,(uint8 *)g_adc3_dma_data1,ADC_DATA_LENGTH * sizeof(uint32_t),remote_ip,remote_port);
                                if (sent_length == sizeof(g_adc3_dma_data1) / sizeof(uint32_t))
                                        {
                                 TxNum += sizeof(g_adc3_dma_data1) / sizeof(uint32_t);
                                        HAL_Delay(100);
//                                memset(g_adc3_dma_data1, 0, ADC_DATA_LENGTH );//清除数据
                                g_adc3_dma_complete_flag = 0;             // 发送完成后,重置DMA完成标志
                                HAL_Delay(100);
                                HAL_ADC_Start_DMA(&hadc3,(uint32_t *)g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集               
                                    }
                                else
                                {
                                                break;
                                }
                        }
//                        recvfrom(SOCK_UDPS,g_adc3_dma_data1,ADC_DATA_LENGTH,local_ip,&local_port);
                                       
                       
                        break;
                }
}       






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-6-29 08:19:26 | 显示全部楼层
是否已经确认了发送前的数据是没问题的,如果确认了,那就是5500发送的问题,如果也有问题,注意Cache配置,可以考虑直接DCache Disable试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:36 , Processed in 0.049300 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表