stm32f2 spi从模式使用DMA传输,不停进中断?郁闷了!求指点

[复制链接]
10918|16
 楼主| 戒指320 发表于 2013-3-16 00:27 | 显示全部楼层 |阅读模式
如题,主机端使用103的片子配置成spi主模式,从机端使用f205 DMA方式收发,但是只要从机这段进入了相应的中断,就不停的进入,而且进去了以后我 查看中断悬起位还是0。 中断悬起位是0,竟然还会进中断。比较郁闷,求指点。
附上代码

  1. static  DMA_InitTypeDef    DMA_InitStructureTx;
  2. static  DMA_InitTypeDef    DMA_InitStructureRx;

  3. static  SPI_InitTypeDef  SPI_InitStructure;

  4. static void NVIC_Configuration(void)
  5. {
  6.    NVIC_InitTypeDef NVIC_InitStructure;

  7.   /* Configure the SPI interrupt priority */
  8.   NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream2_IRQn;//spi1 rx;
  9.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  10.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  11.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.   NVIC_Init(&NVIC_InitStructure);

  13.   /* Configure the SPI interrupt priority */
  14.   NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream3_IRQn;//spi1 tx;
  15.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  16.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  17.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  18.   NVIC_Init(&NVIC_InitStructure);       
  19. }

  20. static void SPI_RCC_GPIO_Config(void)
  21. {
  22.   GPIO_InitTypeDef GPIO_InitStructure;

  23.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  24.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  25.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

  26.   /*!< Connect SPI pins to AF5 */  
  27.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
  28.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
  29.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
  30.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);       
  31.   // NSS CLK MISO
  32.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  33.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  34.        
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  37.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  38.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  39.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  40.        
  41.   /* MOSI        
  42.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  43.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  44.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  45.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  46.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  47.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  48. */
  49.   /* SPI configuration -------------------------------------------------------*/
  50.   SPI_I2S_DeInit(SPI1);
  51.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  52.   SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;               
  53.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       
  54.   
  55.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  56.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  57.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  58.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  59.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  60.   SPI_InitStructure.SPI_CRCPolynomial = 7;
  61.   
  62.   SPI_CalculateCRC(SPI1,DISABLE);
  63.   SPI_Init(SPI1, &SPI_InitStructure);

  64.   SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
  65.   SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
  66.        
  67.   SPI_Cmd(SPI1, ENABLE);                /* 使能SPI  */
  68. }

  69. void DMA_Config(void)
  70. {

  71.         //发送通道
  72.         DMA_DeInit(DMA2_Stream3);
  73.         DMA_InitStructureTx.DMA_Channel = DMA_Channel_3;
  74.         DMA_InitStructureTx.DMA_PeripheralBaseAddr =(u32)&SPI1->DR;//SPI1的DR寄存器地址
  75.         DMA_InitStructureTx.DMA_Memory0BaseAddr = 0;//(u32)SPI1_TX_Buf;
  76.         DMA_InitStructureTx.DMA_DIR = DMA_DIR_MemoryToPeripheral;  
  77.         DMA_InitStructureTx.DMA_BufferSize = 1;
  78.         DMA_InitStructureTx.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  79.         DMA_InitStructureTx.DMA_MemoryInc = DMA_MemoryInc_Enable;  //DMA内存地址自动增加模式
  80.         DMA_InitStructureTx.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  81.         DMA_InitStructureTx.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  82.         DMA_InitStructureTx.DMA_Mode = DMA_Mode_Normal;   
  83.         DMA_InitStructureTx.DMA_Priority = DMA_Priority_Low;
  84.     DMA_InitStructureTx.DMA_FIFOMode = DMA_FIFOMode_Disable;
  85.     DMA_InitStructureTx.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  86.     DMA_InitStructureTx.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  87.     DMA_InitStructureTx.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;       
  88.         DMA_Init(DMA2_Stream3, &DMA_InitStructureTx);

  89.          DMA_ITConfig(DMA2_Stream3, DMA_IT_TC, ENABLE);
  90.      DMA_Cmd(DMA2_Stream3, DISABLE);

  91.         //接收通道
  92.         DMA_DeInit(DMA2_Stream2);
  93.         DMA_InitStructureRx.DMA_Channel = DMA_Channel_3;
  94.         DMA_InitStructureRx.DMA_PeripheralBaseAddr =(u32)&SPI1->DR;//SPI2的DR寄存器地址
  95.         DMA_InitStructureRx.DMA_Memory0BaseAddr = 0;//(u32)SPI2_RX_Buf;
  96.         DMA_InitStructureRx.DMA_DIR = DMA_DIR_PeripheralToMemory;  
  97.         DMA_InitStructureRx.DMA_BufferSize = 10;
  98.         DMA_InitStructureRx.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  99.         DMA_InitStructureRx.DMA_MemoryInc = DMA_MemoryInc_Enable;  //DMA内存地址自动增加模式
  100.         DMA_InitStructureRx.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  101.         DMA_InitStructureRx.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  102.         DMA_InitStructureRx.DMA_Mode = DMA_Mode_Normal;   
  103.         DMA_InitStructureRx.DMA_Priority = DMA_Priority_High;
  104.     DMA_InitStructureRx.DMA_FIFOMode = DMA_FIFOMode_Disable;
  105.     DMA_InitStructureRx.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  106.     DMA_InitStructureRx.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  107.     DMA_InitStructureRx.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;               
  108.         DMA_Init(DMA2_Stream2, &DMA_InitStructureRx);

  109.     /* Enable SPI DMA Tx request */

  110.      DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE);
  111.      DMA_Cmd(DMA2_Stream2, DISABLE);
  112.          
  113.                  DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF2);      //清DMA发送完成标志
  114.         DMA_ClearFlag(DMA2_Stream3,DMA_FLAG_TCIF3);      //清DMA发送完成标志

  115. }
  116. int dummy[2];
  117. //dir =0 接收data   = 1 发送pcm
  118. void DMA_Transmit(u32 addr, u32 size, u8 dir)
  119. {
  120.         if (dir==1)
  121.         {//发送 tx
  122.                 DMA_Cmd(DMA2_Stream3, DISABLE);

  123.                 DMA_InitStructureTx.DMA_Memory0BaseAddr = addr;
  124.                 DMA_InitStructureTx.DMA_BufferSize = size;
  125.                 DMA_Init(DMA2_Stream3, &DMA_InitStructureTx);
  126.        
  127.                 DMA_Cmd(DMA2_Stream3, ENABLE);
  128.         }
  129.         else
  130.         {//接收 rx
  131.                 DMA_Cmd(DMA2_Stream2, DISABLE);

  132.                 DMA_InitStructureRx.DMA_Memory0BaseAddr = addr;
  133.                 DMA_InitStructureRx.DMA_BufferSize = size;
  134.                 DMA_Init(DMA2_Stream2, &DMA_InitStructureRx);
  135.                
  136.                 DMA_Cmd(DMA2_Stream2, ENABLE);
  137.         }       
  138. }


  139. unsigned char SPI_TX_Buf[10005];
  140. unsigned char SPI_RX_Buf[10005];

  141. void rt_hw_spi_init(void)
  142. {
  143.         SPI_RCC_GPIO_Config();
  144.         NVIC_Configuration();
  145.         DMA_Config();

  146.         DMA_Transmit((u32)SPI_RX_Buf, sizeof(SPI_RX_Buf)-5, 0);
  147. }



  148. void DMA2_Stream2_IRQHandler(void)//rx  主机发送
  149. {

  150.   /* Check the interrupt source */
  151.   if (DMA_GetITStatus(DMA2_Stream2,DMA_FLAG_TCIF2)==SET)
  152.   {
  153.              DMA_ClearITPendingBit(DMA2_Stream2,DMA_FLAG_TCIF2|DMA_FLAG_TEIF2);
  154.    
  155.       DMA_Cmd(DMA2_Stream2, DISABLE);
  156.           rt_kprintf(" spi rx done!\r\n");
  157.        
  158.   }
  159. }

  160. void DMA2_Stream3_IRQHandler(void)//tx   主机接收
  161. {
  162.        
  163.   if (DMA_GetITStatus(DMA2_Stream3,DMA_FLAG_TCIF3)==SET)
  164.   {
  165.              DMA_ClearITPendingBit(DMA2_Stream3,DMA_FLAG_TCIF3|DMA_FLAG_TEIF3);
  166.           rt_kprintf(" spi tx done!\r\n");
  167.    
  168.       DMA_Cmd(DMA2_Stream3, DISABLE);
  169.        
  170.   }
  171. }

airwill 发表于 2013-3-16 12:35 | 显示全部楼层
不停进入, 很可能是中断标志没有清除
 楼主| 戒指320 发表于 2013-3-16 12:59 | 显示全部楼层
airwill 发表于 2013-3-16 12:35
不停进入, 很可能是中断标志没有清除

我进入中断后,没发现中断标志被置位
airwill 发表于 2013-3-16 13:25 | 显示全部楼层
也没有说进的是什么中断, 调试器进入中断去看中断标志寄存器吧
 楼主| 戒指320 发表于 2013-3-16 22:50 | 显示全部楼层
airwill 发表于 2013-3-16 13:25
也没有说进的是什么中断, 调试器进入中断去看中断标志寄存器吧

呵呵,发现中断标示全是0  。就郁闷在这里
 楼主| 戒指320 发表于 2013-3-16 22:51 | 显示全部楼层
谁能指点下,谢谢了!
 楼主| 戒指320 发表于 2013-3-16 23:58 | 显示全部楼层
指点下 送3.2寸 触摸屏
 楼主| 戒指320 发表于 2013-3-16 23:58 | 显示全部楼层
hawksabre 发表于 2013-3-17 11:02 | 显示全部楼层
可能是中断触发电平选择不对  这个有可能   换个触发电平试试
hawksabre 发表于 2013-3-17 11:03 | 显示全部楼层
实在搞不定  就找FAE   直接打电话  看看他们的指导建议  呵呵
 楼主| 戒指320 发表于 2013-3-17 11:10 | 显示全部楼层
hawksabre 发表于 2013-3-17 11:03
实在搞不定  就找FAE   直接打电话  看看他们的指导建议  呵呵

使用的是spi 从接收,不用触发电平的选择的。
 楼主| 戒指320 发表于 2013-3-17 11:16 | 显示全部楼层
FAE联系方式 谁能提供一个??
p1093 发表于 2013-3-22 15:00 | 显示全部楼层
碰到一樣問題
data sheet指出spi transmit完成需要三個確認步驟
TCIF=1 -> TXE=1 -> BSY=0

直接改為check BSY flag可避開


hqfmcu201 发表于 2013-5-16 17:23 | 显示全部楼层
谢谢分享经验
cjhk 发表于 2013-5-16 18:50 | 显示全部楼层
问题搞定了就好   多逛21ic     真的学到了很多东西
1044132648 发表于 2017-11-30 15:32 | 显示全部楼层
从机的输出不应该是MISO吗,楼主怎么是MISO
5768340 发表于 2017-12-15 16:11 | 显示全部楼层
请问楼主解决了吗 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:淘宝小店: http://shop73275611.taobao.com

37

主题

290

帖子

2

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