你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f051r8 SPI_DMA求助

[复制链接]
sinc_mark 提问时间:2014-7-5 14:59 /
 使用stm32f051r8 SPI_DMA,进行配置后,能进行SPI DMA的收发,本意是将数据收到一个固定的数组中(RfBuf),在进行测试时,在发送端发送一个固定格式的数据,在spi接收端使用DMA读取,在进行测试时,发现以下问题:
例如发送固定的数据01,02,03,04...
在进行接收的时候,一开始运行,RfBuf接收数据正确收到01,02,03,04..,但当运行大概一段时间后,接收数组RfBuf收到的数据会突然向右移动三个字节,变成00,00,00,01,02,03,04...突然在真实数据的前面加了三个字节的00,接收数据的后三个字节丢弃,再运行一段时间,收到的数据再左移一个字节,变为00,00,01,02,03,04...丢弃后两个字节,再运行一段时间后再次左移一个字节,变为00,01,02,03,04... 运行一段时间后变成01,02,03,04..(正确的数据格式).,之后重复此过程,感觉上这个变化的间隔时间没规律可言,但变化的方向是一致的,先右移动3字节,之后三次左移1个字节恢复正常,重复此过程。
为了测试是不是数据发送端的问题,我使用一般的SPI模式读取,得到的数据是正常的,这个表明不是发送端的问题,下面是我的SPI DMA 配置:
        DMA_InitTypeDef   DMA_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;
        // Enable DMA1 clock//
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //SPI2 RX DMA  将数据从外设读取到内部存储器中
        SPI_Cmd(SPI2, DISABLE);
        DMA_Cmd(DMA1_Channel4, DISABLE);
        DMA_DeInit(DMA1_Channel4);                //
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)RfBuf;
        DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;//外设为源地址
        DMA_InitStructure.DMA_BufferSize         = 64;
        DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;        //传输时外设地址不自增
        DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;                //内存自增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设传输长度为8 bit
        DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;                //内存传输长度为8 bit
        DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;                                //非循环采集
        DMA_InitStructure.DMA_Priority           = DMA_Priority_High;                        //优先级为中
        DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;                                //非存储器到存储器模式
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
 
       
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC | DMA_IT_TE,ENABLE);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE); 
        DMA_Cmd(DMA1_Channel4, DISABLE);
 
 
        // Tx DMA Config
        DMA_Cmd(DMA1_Channel5, DISABLE);
        DMA_DeInit(DMA1_Channel5);
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)dummy;
        DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize         = 64;
        DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Disable;//DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority           = DMA_Priority_Low;
        DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
 
        DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE); 
        DMA_Cmd(DMA1_Channel5, DISABLE);
 
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        SPI_Cmd(SPI2, ENABLE);
在主函数中启动发送过程:
                        SPI2->DR;
                        DMA_Cmd(DMA1_Channel5, DISABLE);
                        DMA_SetCurrDataCounter(DMA1_Channel5,64);
                        DMA_Cmd(DMA1_Channel4, DISABLE);
                        DMA_SetCurrDataCounter(DMA1_Channel4,64);
                               
 
 
                        A7130_SPI2_DMA_RX(64,1);
                        A7130_SPI2_DMA_TX(64);

 
 
中断处理过程
void DMA1_Channel4_5_IRQHandler(void)
{
 
        //rx
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4) == SET)
        {
                DMA_ClearITPendingBit(DMA1_FLAG_TC4 | DMA1_FLAG_HT4 |DMA1_FLAG_TE4);                //DMA1_FLAG_TC2 | DMA1_FLAG_HT2 | DMA1_FLAG_TE2
                DMA_Cmd(DMA1_Channel4, DISABLE);
 
        }
 
        //发送完成
        if(DMA_GetITStatus(DMA1_IT_TC5) == SET)
        {
                DMA_ClearITPendingBit(DMA1_FLAG_TC5 | DMA1_FLAG_HT5 |DMA1_FLAG_TE5);
 
                DMA_Cmd(DMA1_Channel5, DISABLE);
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);
                SPI2->DR;
       
        }

 
请遇到类似情况的兄弟指导,谢谢!
 
 
 
 
 
收藏 评论6 发布时间:2014-7-5 14:59

举报

6个回答
sinc_mark 回答时间:2014-7-7 08:02:27

RE:stm32f051r8 SPI_DMA求助

有人遇到过类似的情况么?
巅峰残狼 回答时间:2014-7-12 14:47:45

RE:stm32f051r8 SPI_DMA求助

没遇到过,楼主解决之后记得分享,谢谢啦
巅峰残狼 回答时间:2014-7-22 20:28:30

RE:stm32f051r8 SPI_DMA求助

我发现这个帖子已经被置顶了好几次了,到现在都没人解决。。。。楼主解决没,分享一下呗
aaa999kk 回答时间:2014-7-24 14:33:34

RE:stm32f051r8 SPI_DMA求助

会不会在设置中指针设错了一个位啊
hnccliu 回答时间:2014-12-1 12:51:12
请问楼主有没有解决?我也遇到同样的问题。
safesage 回答时间:2017-9-6 17:10:00
解决了吗?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版