谁能 帮忙 看下 SPI DMA发送 我勒个去,是设备时序操作错误

[复制链接]
1570|6
 楼主| shen520 发表于 2015-9-27 13:10 | 显示全部楼层 |阅读模式
本帖最后由 shen520 于 2015-9-27 14:28 编辑


void SPI_1_DMATx(u8 *Buf , u16 length)
{
         DMA_InitTypeDef DMA_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
         
         DMA_DeInit(DMA1_Channel3);  
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI1->DR;              //设置  接收外设(0x4001300C) 地址(源地址)
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buf;                   //设置 SRAM 存储地址(源地址)
   DMA_InitStructure.DMA_DIR            = DMA_DIR_PeripheralDST;           //传输方向 内存-外设
   DMA_InitStructure.DMA_BufferSize     = length;                          //设置 SPI1 接收长度
   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_Normal;             //传输方式,一次传输完停止,不重新加载
   DMA_InitStructure.DMA_Priority           = DMA_Priority_VeryHigh;       //中断方式-高(三级)
   DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;             //内存到内存方式禁止
   DMA_Init(DMA1_Channel3, &DMA_InitStructure);
    DMA_ClearFlag(DMA1_FLAG_TC3);                  //清除通道4传输完成标志

         SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx , ENABLE);
   DMA_Cmd(DMA1_Channel3, ENABLE);                   //开启 DMA 通道 DMA1_Channel3

         while(DMA_GetFlagStatus(DMA1_FLAG_TC3)==RESET);//判断通道4传输完成        

   DMA_ClearFlag(DMA1_FLAG_TC3);                  //清除通道4传输完成标志  
         
         SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx , DISABLE);
   DMA_Cmd(DMA1_Channel3, DISABLE);                   //开启 DMA 通道 DMA1_Channel3
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);        //使能DMA传输
}
风吹小浪 发表于 2015-9-28 08:00 | 显示全部楼层
看了看,楼主好像用的是ST的库吧,出现问题很正常,建议用GD的库。
风吹小浪 发表于 2015-9-28 08:00 | 显示全部楼层
给你个AD DMA的例程看看
  1. /**
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    DMA/ADC1_DMA/main.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  MCU SD
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    26-Dec-2014
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   Main program body.
  8.   ******************************************************************************
  9.   */

  10. /* Includes ------------------------------------------------------------------*/
  11. #include "gd32f10x.h"
  12. #include "main.h"

  13. /* Private typedef -----------------------------------------------------------*/

  14. /* Private define ------------------------------------------------------------*/
  15. #define RCC_GPIO_LED1               RCC_APB2PERIPH_GPIOC
  16. #define GPIO_LED1_PORT              GPIOC
  17. #define RCC_GPIO_LED2               RCC_APB2PERIPH_GPIOC
  18. #define GPIO_LED2_PORT              GPIOC   
  19. #define GPIO_LED1                   GPIO_PIN_0   
  20. #define GPIO_LED2                   GPIO_PIN_2

  21. #define RCC_GPIO_LED3               RCC_APB2PERIPH_GPIOE
  22. #define GPIO_LED3_PORT              GPIOE
  23. #define RCC_GPIO_LED4               RCC_APB2PERIPH_GPIOE
  24. #define GPIO_LED4_PORT              GPIOE
  25. #define GPIO_LED3                   GPIO_PIN_0   
  26. #define GPIO_LED4                   GPIO_PIN_1

  27. /* Private variables ---------------------------------------------------------*/
  28. /* Private variables ---------------------------------------------------------*/
  29. #define ADC_DR_Address    ((u32)0x4001244C)

  30. float AD_value;
  31. __IO uint16_t ADC_ConvertedValue;

  32. DMA_InitPara  DMA_InitStructure;

  33. __IO uint32_t TimingDelay = 0;
  34. void RCC_Configuration(void);
  35. static void SysTickConfig(void);
  36. void USART_Configuration(void);
  37. void ADC_Configuration(void);

  38. /* Private functions ---------------------------------------------------------*/
  39. /**
  40.   * @brief  Main program
  41.   * @param  None
  42.   * @retval None
  43.   */
  44. int main(void)
  45. {
  46.       
  47.     /* System Clocks Configuration */
  48.     RCC_Configuration();
  49.                            
  50.     /* SysTick configuration */
  51.     SysTickConfig();
  52.                         
  53.     LED_config() ;
  54.     GPIO_SetBits(GPIO_LED1_PORT, GPIO_LED1);
  55.     GPIO_ResetBits(GPIO_LED3_PORT, GPIO_LED3);
  56.     GPIO_ResetBits(GPIO_LED2_PORT, GPIO_LED2);
  57.     GPIO_ResetBits(GPIO_LED4_PORT, GPIO_LED4);
  58.    
  59.     USART_Configuration();

  60.     /* DMA1 channel1 configuration */
  61.     DMA_DeInit(DMA1_CHANNEL1);
  62.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
  63.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
  64.     DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;
  65.     DMA_InitStructure.DMA_BufferSize = 1;
  66.     DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
  67.     DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_DISABLE;
  68.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_HALFWORD;
  69.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_HALFWORD;
  70.     DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
  71.     DMA_InitStructure.DMA_Priority = DMA_PRIORITY_VERYHIGH;
  72.     DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
  73.     DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure);
  74.             
  75.     /* Enable DMA transfer */
  76.     DMA_Enable(DMA1_CHANNEL1, ENABLE);
  77.     ADC_Configuration();
  78.     Delay(300);     
  79.     while (1)
  80.     {
  81.         /***********************************************ADC采集转换********************************************************/
  82.          
  83.         /* Printf message with AD value to serial port every 1 second */
  84.         AD_value = ADC_ConvertedValue;
  85.         AD_value = (AD_value/4096)*3.3;
  86.         printf("The current AD value = %4.2fV \r\n", AD_value);
  87.         Delay(1000);   /* delay 1000ms */      
  88.     }
  89. }

  90. /**
  91.   * @brief  Led configure
  92.   * @param  None
  93.   * @retval None
  94.   */
  95. void LED_config(void)
  96. {
  97.     GPIO_InitPara GPIO_InitStructure;
  98.    
  99.     /* Enable the GPIO_LED Clock */
  100.     RCC_APB2PeriphClock_Enable(RCC_GPIO_LED1 | RCC_GPIO_LED2 | RCC_GPIO_LED3 | RCC_GPIO_LED4, ENABLE);
  101.    
  102.     /* Configure the GPIO_LED pin */
  103.     GPIO_InitStructure.GPIO_Pin = GPIO_LED1 | GPIO_LED2;   
  104.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
  105.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  106.     GPIO_Init(GPIO_LED1_PORT, &GPIO_InitStructure);
  107.     GPIO_Init(GPIO_LED2_PORT, &GPIO_InitStructure);
  108.     GPIO_InitStructure.GPIO_Pin = GPIO_LED3 | GPIO_LED4;   
  109.     GPIO_Init(GPIO_LED3_PORT, &GPIO_InitStructure);
  110.     GPIO_Init(GPIO_LED4_PORT, &GPIO_InitStructure);

  111. }
  112. /**
  113.   * @brief  Configure the different system clocks.
  114.   * @param  None
  115.   * @retval None
  116.   */
  117. void RCC_Configuration(void)
  118. {
  119.     /* Enable peripheral clocks */
  120.     /* Enable DMA1 clock */
  121.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_DMA1, ENABLE);

  122. }

  123. void USART_Configuration(void)
  124. {
  125.     GPIO_InitPara     GPIO_InitStructure;
  126.     USART_InitPara    USART_InitStructure;

  127.     /* Enable GPIO clock */
  128.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_AF, ENABLE);

  129.     USART_InitStructure.USART_BRR = 115200;
  130.     USART_InitStructure.USART_WL = USART_WL_8B;
  131.     USART_InitStructure.USART_STBits = USART_STBITS_1;
  132.     USART_InitStructure.USART_Parity = USART_PARITY_RESET;
  133.     USART_InitStructure.USART_HardwareFlowControl = USART_HARDWAREFLOWCONTROL_NONE;
  134.     USART_InitStructure.USART_RxorTx = USART_RXORTX_RX | USART_RXORTX_TX;

  135.     /* Enable USART clock */
  136.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE);
  137.    
  138.   /* Configure USART Tx as alternate function push-pull */
  139.   GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  140.   GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9;
  141.   GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  142.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  143.   /* Configure USART Rx as input floating */
  144.   GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
  145.   GPIO_InitStructure.GPIO_Pin = GPIO_PIN_10;
  146.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  147.    
  148.      /* USART configuration */
  149.     USART_Init(USART1, &USART_InitStructure);
  150.    
  151.     /* Enable USART */
  152.     USART_Enable(USART1, ENABLE);
  153.     USART_ClearBitState(USART1,USART_FLAG_TC);
  154. }



  155. /*******************************************************************************
  156. * Function Name  : ADC_Configuration
  157. * Description    : Configure the ADC.
  158. * Input          : None
  159. * Output         : None
  160. * Return         : None
  161. * Attention                 : None
  162. *******************************************************************************/
  163. void ADC_Configuration(void)
  164. {
  165.     ADC_InitPara ADC_InitStructure;
  166.     GPIO_InitPara GPIO_InitStructure;
  167.    
  168.     RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV6);
  169.    
  170.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1 | RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_AF, ENABLE);
  171.    
  172.     /* Configure PC.03 (ADC12 Channel3)as analog input -------------------------*/
  173.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3;
  174.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  175.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AIN;
  176.     GPIO_Init(GPIOC, &GPIO_InitStructure);   
  177.    
  178.     /* ADC1 configuration ------------------------------------------------------*/
  179.     ADC_InitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;
  180.     ADC_InitStructure.ADC_Mode_Scan = ENABLE;
  181.     ADC_InitStructure.ADC_Mode_Continuous = ENABLE;
  182.     ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
  183.     ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
  184.     ADC_InitStructure.ADC_Channel_Number = 1;
  185.     ADC_Init(ADC1, &ADC_InitStructure);
  186.    
  187.     /* ADC1 regular channel 0 configuration */
  188.     ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_13, 1, ADC_SAMPLETIME_239POINT5);
  189.    
  190.     /* Enable ADC1 DMA */
  191.     ADC_DMA_Enable(ADC1, ENABLE);
  192.    
  193.     /* Enable ADC1 */
  194.     ADC_Enable(ADC1, ENABLE);
  195.    
  196.     /* Enable ADC1 calibaration register */   
  197.     ADC_Calibration(ADC1);
  198.      
  199.     /* Start ADC1 Software Conversion */
  200.     ADC_SoftwareStartConv_Enable(ADC1, ENABLE);
  201. }

  202. /**
  203. * @brief  Configure a SysTick Base time to 1 ms.
  204. * @param  None
  205. * @retval None
  206. */
  207. static void SysTickConfig(void)
  208. {
  209.     /* Setup SysTick Timer for 1ms interrupts */
  210.     if (SysTick_Config(SystemCoreClock / 1000))
  211.     {
  212.         /* Capture error */
  213.         while (1);
  214.     }
  215.    
  216.     /* Configure the SysTick handler priority */
  217.     NVIC_SetPriority(SysTick_IRQn, 0x0);
  218. }

  219. /**
  220. * @brief  Insert a delay time.
  221. * @param  nTime: specify the delay time length.
  222. * @retval None
  223. */
  224. void Delay(__IO uint32_t nTime)
  225. {
  226.     TimingDelay = nTime;

  227.     while(TimingDelay != 0);
  228. }

  229. /**
  230. * @brief  Decrement the TimingDelay variable.
  231. * @param  None
  232. * @retval None
  233. */
  234. void TimingDelay_Decrement(void)
  235. {
  236.     if(TimingDelay != 0x00)
  237.     {
  238.         TimingDelay --;
  239.     }
  240. }

  241. /**
  242.   * @brief  Retarget the C library printf function to the USART.
  243.   * @param  None
  244.   * @retval None
  245.   */
  246. PUTCHAR_PROTOTYPE
  247. {
  248.     /* Place your implementation of fputc here */
  249.     /* e.g. write a character to the USART */
  250.     USART_DataSend(USART1, (uint8_t) ch);
  251.    
  252.     /* Loop until the end of transmission */
  253.     while (USART_GetBitState(USART1, USART_FLAG_TC) == RESET)
  254.     {}
  255.    
  256.     return ch;
  257. }

  258. /******************* (C) COPYRIGHT 2014 GIGADEVICE *****END OF FILE****/
我的期待 发表于 2015-9-28 16:56 | 显示全部楼层
用ST库的话,要注意ST和GD SPI的异同
塞北旅途 发表于 2015-9-28 23:12 | 显示全部楼层
标志是不是清除的有点早了
elecintop 发表于 2015-9-29 20:50 | 显示全部楼层
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);        //使能DMA传输
这句是不是有问题了?DISABLE不是禁止的意思么
稳稳の幸福 发表于 2015-9-30 19:49 | 显示全部楼层
用GD的芯片最好用GD自己的头文件和库函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

24

帖子

1

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