打印

SPI1从模式DMA接收,不配置SPI1收到错误数据,配置后收不到

[复制链接]
3083|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyline1982|  楼主 | 2011-4-1 19:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
奇怪。。。

想用SPI1在从模式下用DMA接收数据。

一开始忘了配置SPI1,但是还能收到数据,数不对,比如发的是0X32  收到的0X37.类似这样的错误,反正是全错。

调试了好久,发现程序里忘了配置SPI1,就配置了下。。结果什么都收不到了。把配置程序注释掉后,又出现了一样的错误数据,但是能收了。

这是怎么回事啊。附源码。麻烦大家帮我看看,谢谢了。

SPI1配置:

/*spi部分设置*/
void SPI_Configuration(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  SPI_Cmd(SPI1, DISABLE);  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                            //从
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //CPOL=0 时钟悬空低
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA=1 数据捕获第1个
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS
       SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
    SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7
     
SPI_Init(SPI1, &SPI_InitStructure);
    }


DMA部分程序。。


void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef  NVIC_InitStructure;
DMA_DeInit(DMA1_Channel2);                                                                               //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI1_DR_Address;                //源头BUF 既是 (&(USART1->DR))  
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_DMA;                //目标BUF 既是要写在哪个个数组之中
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                      //外设作源头//外设是作为数据传输的目的地还是来源
DMA_InitStructure.DMA_BufferSize = 4096;                                        //DMA缓存的大小 单位在下边设定
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;               //外设地址寄存器不递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;        //外设字节为单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;            //内存字节为单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                               //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;                            //4优先级之一的(高优先) VeryHigh/High/Medium/Low
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                //非内存到内存
DMA_Init(DMA1_Channel2, &DMA_InitStructure);                                    //根据DMA_InitStruct中指定的参数初始化DMA的通道1寄存器
  //DMA中断配置//
DMA_ITConfig(DMA1_Channel2,(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE), ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);                              
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_CalculateCRC(SPI1, ENABLE);
SPI_Cmd(SPI1, ENABLE);
DMA_Cmd(DMA1_Channel2, ENABLE);
  }
 
沙发
airwill| | 2011-4-2 09:25 | 只看该作者
又有人遇到与 DMA 数据传输有关的数据错误问题了, 如果关闭 DMA 用中断来读取, 看看有没有传输错误呢?
哦, 做个试验看看.

使用特权

评论回复
板凳
w_u123| | 2011-4-26 15:56 | 只看该作者
没看到你关于 设备时钟的 配置呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝