搜索

出邪了,采用SPI的DMA就收不到数呢

[复制链接]
1883|7
 楼主 | 2012-6-18 10:24 | 显示全部楼层 |阅读模式
spi, DMA, ni, ST, IO
void SPI_Configuration(void)
{
SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
  /* PB15-MOSI2,PB13-SCK2*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  /* SPI2 configuration */
  SPI_Cmd(SPI2, DISABLE);             //必须先禁能,才能改变MODE
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //两线全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;       //主
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;      //16位
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //CPOL=1
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       //CPHA=1
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //软件NSS
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //2分频
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;      //高位在前
  SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC7
  SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE);
// SPI_CalculateCRC(SPI2, ENABLE);
// SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/*UART2*/
// NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
#if 1
  /*DMA的配置 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA通道1*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(&(SPI2->DR));  //ADC1数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)(DmaBuf); //获取ADC的数组   要存放的位置
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;     //片内外设作源头
DMA_InitStructure.DMA_BufferSize = DMA_DEBUGINITSIZE; //  DMA_SENSORBUFSIZE;        //每次DMA16个数据
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_MemoryDataSize_Byte;   //半字
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        //普通模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;       //高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;        //非内存到内存
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA_ITConfig(DMA1_Channel1, DMA_IT_TC|DMA_IT_TE, ENABLE);        //DMA通道1传输完成中断

/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  /* Enable DMA channel6 IRQ Channel */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
}
就是进不了中断,为什么呢,高手解答下吧
 楼主 | 2012-6-18 10:25 | 显示全部楼层
不采用DMA确收得到数据,问题在哪里呢

使用特权

评论回复
| 2012-6-18 16:32 | 显示全部楼层
没看吗出来有什么问题

使用特权

评论回复
| 2012-6-19 10:05 | 显示全部楼层
用过1个STM32 SPI SD卡的例子,用POLLING、DMA都行的。
建议LZ也试试这个例子,仿照这个例子来改,这样比较保险。

使用特权

评论回复
| 2012-6-19 10:13 | 显示全部楼层
使用DMA进行SPI接收数据,需要使用另外一个DMA进行数据发送,才能收到数据。

使用特权

评论回复
| 2012-6-19 14:35 | 显示全部楼层
老兄,你收到数据那才叫出邪了。你的DMA通道选错了,SPI2接收是Channel 4。
2012-6-19 14-35-16.png

使用特权

评论回复
| 2012-6-19 14:37 | 显示全部楼层
5# puppyh 没有这个限制吧,用查询的方式发送,一样可以DMA接收。

使用特权

评论回复
| 2016-8-31 09:54 | 显示全部楼层
现在可以正常接收数据了吗,我用SPI DMA方式就是收不到数据,不知道为何,邪乎

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表