• 基于UCOSII的DMA-SPI通信


    基于UCOSII的DMA-SPI通信_fluffy_floppy的博客-CSDN博客

    代码有点小bug,比如主机的dma定义长度为8位,发送8为数据为:0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08,从机第一次接收数据格式:0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08。第二次接收数据:0x01 0x01 0x02 0x03 0x04 0x05 0x06 0x07。第三次0x08 0x01 0x02 0x03 0x04 0x05 0x06 0x07。经修改,从机接收长度为9位:接收的格式为:0x01 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08。
     

    主机DMA_SPI1:

    1. 

    1. #include "spi.h"
    2. volatile uint8_t SPI2_TxBuf[8];
    3. volatile uint8_t SPI_RX_Buff[8];
    4. u8 Master_Temp =0;
    5. void SPI1_Init(void)
    6. {
    7. NVIC_InitTypeDef NVIC_InitStructure;
    8. GPIO_InitTypeDef GPIO_InitStructure;
    9. SPI_InitTypeDef SPI_InitStructure;
    10. DMA_InitTypeDef DMA_Initstructure;
    11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜPA¶Ë¿ÚʱÖÓ
    12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
    13. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
    14. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
    17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    18. GPIO_Init(GPIOA, &GPIO_InitStructure);
    19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    21. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    22. GPIO_Init(GPIOA, &GPIO_InitStructure);
    23. //SPI_SSOutputCmd(SPI1,ENABLE);
    24. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    25. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI_Mode_Master SPI_Mode_Slave
    26. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    27. SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    28. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    29. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //SPI_NSS_Hard SPI_NSS_Soft
    30. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
    31. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    32. SPI_InitStructure.SPI_CRCPolynomial = 7;
    33. SPI_Init(SPI1, &SPI_InitStructure);
    34. SPI_Cmd(SPI1, ENABLE);
    35. //SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);
    36. DMA_DeInit(DMA1_Channel3);
    37. DMA_Initstructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    38. DMA_Initstructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_TxBuf;
    39. DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralDST;
    40. DMA_Initstructure.DMA_BufferSize = 0;
    41. DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    42. DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    43. DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    44. DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    45. DMA_Initstructure.DMA_Mode = DMA_Mode_Normal;
    46. DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh;
    47. DMA_Initstructure.DMA_M2M = DMA_M2M_Disable;
    48. DMA_Init(DMA1_Channel3, &DMA_Initstructure);
    49. //DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
    50. SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
    51. DMA_DeInit(DMA1_Channel2);
    52. DMA_Initstructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
    53. DMA_Initstructure.DMA_MemoryBaseAddr = (uint32_t)SPI_RX_Buff;
    54. DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    55. DMA_Initstructure.DMA_BufferSize = 0;
    56. DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    57. DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    58. DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    59. DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    60. DMA_Initstructure.DMA_Mode = DMA_Mode_Normal;
    61. DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh;
    62. DMA_Initstructure.DMA_M2M = DMA_M2M_Disable;
    63. DMA_Init(DMA1_Channel2, &DMA_Initstructure);
    64. // DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
    65. SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Rx,ENABLE);
    66. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
    67. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    68. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    69. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    70. NVIC_Init(&NVIC_InitStructure);
    71. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
    72. NVIC_Init(&NVIC_InitStructure);
    73. NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
    74. NVIC_Init(&NVIC_InitStructure);
    75. GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
    76. //SPI1_ReadWriteByte(0xff);//Æô¶¯´«Êä
    77. }
    78. void SPI1_SetSpeed(u8 SpeedSet)
    79. {
    80. SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
    81. if(SpeedSet==SPI_SPEED_2)//¶þ·ÖƵ
    82. {
    83. SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz
    84. }else if(SpeedSet==SPI_SPEED_8)//°Ë·ÖƵ
    85. {
    86. SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
    87. }else if(SpeedSet==SPI_SPEED_16)//Ê®Áù·ÖƵ
    88. {
    89. SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
    90. }else //256·ÖƵ
    91. {
    92. SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz µÍËÙģʽ
    93. }
    94. SPI1->CR1|=1<<6; //SPIÉ豸ʹÄÜ
    95. }
    96. u8 SPI1_ReadWriteByte(u8 TxData)
    97. {
    98. u8 retry=0;
    99. while((SPI1->SR&1<<1)==0)//µÈ´ý·¢ËÍÇø¿Õ
    100. {
    101. retry++;
    102. if(retry>200)return 0;
    103. }
    104. SPI1->DR=TxData; //·¢ËÍÒ»¸öbyte
    105. retry=0;
    106. while((SPI1->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte
    107. {
    108. retry++;
    109. if(retry>200)return 0;
    110. }
    111. return SPI1->DR; //·µ»ØÊÕµ½µÄÊý¾Ý
    112. }
    113. u8 SPI1_ReadByte(u8 TxData)
    114. {
    115. u8 retry=0;
    116. while((SPI1->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte
    117. {
    118. retry++;
    119. if(retry>200)return 0;
    120. }
    121. return SPI1->DR; //·µ»ØÊÕµ½µÄÊý¾Ý
    122. }
    123. void SPI1_IRQHandler(void)
    124. {
    125. if((SPI1->SR&1<<0)==1)
    126. {
    127. Master_Temp = SPI1_ReadByte(0x00);
    128. }
    129. }
    130. void DMA1_Channel2_IRQHandler(){//SPI1-RX-DMA
    131. if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET){
    132. DMA_ClearFlag(DMA1_FLAG_TC2);
    133. DMA_Cmd(DMA1_Channel2, DISABLE);
    134. }
    135. }
    136. void DMA1_Channel3_IRQHandler(){//SPI1-TX-DMA
    137. if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET){
    138. DMA_ClearFlag(DMA1_FLAG_TC3);
    139. //DMA_Cmd(DMA1_Channel3, DISABLE);
    140. }
    141. }
    142. /********************************************************/

    2.

    1. /********************************************************/
    2. #include "stm32f10x.h"
    3. #include <stdio.h>
    4. #include "delay.h"
    5. #include "includes.h"
    6. #include "led.h"
    7. #include "spi.h"
    8. #define LED_STK_SIZE 64
    9. #define LED1_STK_SIZE 64
    10. #define START_STK_SIZE 128
    11. #define SPI_SPEED_2 0
    12. #define SPI_SPEED_8 1
    13. #define SPI_SPEED_16 2
    14. #define SPI_SPEED_256 3
    15. #define LED_TASK_Prio 9
    16. #define LED1_TASK_Prio 5
    17. #define START_TASK_Prio 10
    18. str_led pb_13;
    19. str_led pb_14;
    20. extern volatile uint8_t SPI2_TxBuf[8];
    21. extern volatile uint8_t SPI_RX_Buff[8];
    22. uint8_t send_data[10];
    23. uint8_t rev_data[10];
    24. OS_STK TASK_LED1_STK[LED_STK_SIZE];
    25. OS_STK TASK_LED_STK[LED_STK_SIZE];
    26. OS_STK TASK_START_STK[START_STK_SIZE];
    27. void TaskStart(void *pdata);
    28. void TaskLed(void *pdata);
    29. void TaskLed1(void *pdata);
    30. void SysTick_Configuration(void);
    31. void GPIO_Configuration(void)
    32. {
    33. pb_13.GPIOX = GPIOB;
    34. pb_13.pin = GPIO_Pin_13;
    35. pb_14.GPIOX = GPIOB;
    36. pb_14.pin = GPIO_Pin_14;
    37. gpio_led_init(pb_13);
    38. gpio_led_init(pb_14);
    39. }
    40. void SPI1_DMA_SendBytes(void)
    41. {
    42. int i = 0 ;
    43. for(i = 0;i < 8;i++)
    44. {
    45. send_data[i] = (i+2);
    46. }
    47. memcpy((u8 *)SPI2_TxBuf,send_data,8);
    48. DMA_SetCurrDataCounter(DMA1_Channel3, 8);
    49. DMA_SetCurrDataCounter(DMA1_Channel2, 8);
    50. SPI1->DR;
    51. SPI1->DR;
    52. DMA_Cmd(DMA1_Channel3, ENABLE);
    53. DMA_Cmd(DMA1_Channel2, ENABLE);
    54. while(!DMA_GetFlagStatus(DMA1_FLAG_TC4)){
    55. i++;
    56. OSTimeDlyHMSM(0,0,0,005);
    57. if(i>50){
    58. DMA_ClearFlag(DMA1_FLAG_GL3|DMA1_FLAG_TC3|DMA1_FLAG_HT3|DMA1_FLAG_TE3);
    59. DMA_ClearFlag(DMA1_FLAG_GL2|DMA1_FLAG_TC2|DMA1_FLAG_HT2|DMA1_FLAG_TE2);
    60. DMA_Cmd(DMA1_Channel3, DISABLE);
    61. DMA_Cmd(DMA1_Channel2, DISABLE);
    62. return;
    63. }
    64. };
    65. while((SPI1->SR&1<<1)!=0x0002){};
    66. while((SPI1->SR&1<<7)!=0x0000){};
    67. DMA_ClearFlag(DMA1_FLAG_GL3|DMA1_FLAG_TC3|DMA1_FLAG_HT3|DMA1_FLAG_TE3);
    68. DMA_ClearFlag(DMA1_FLAG_GL2|DMA1_FLAG_TC2|DMA1_FLAG_HT2|DMA1_FLAG_TE2);
    69. DMA_Cmd(DMA1_Channel3, DISABLE);
    70. DMA_Cmd(DMA1_Channel2, DISABLE);
    71. memcpy(rev_data,(u8 *)SPI_RX_Buff,8);
    72. }
    73. void NVIC_Configuration(void)
    74. {
    75. //NVIC_InitTypeDef NVIC_InitStructure;
    76. /* Configure the NVIC Preemption Priority Bits */
    77. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //???????:?????0?,????4?
    78. //???????????
    79. #ifdef VECT_TAB_RAM
    80. /* Set the Vector Table base location at 0x20000000 */
    81. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //?????RAM
    82. #else /* VECT_TAB_FLASH */
    83. /* Set the Vector Table base location at 0x08000000 */
    84. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //?????FLASH
    85. #endif
    86. }
    87. void RCC_Configuration(void)
    88. {
    89. SystemInit();
    90. }
    91. void SPI_Configuration(void)
    92. {
    93. SPI1_Init();
    94. memset((u8 *)SPI2_TxBuf,0,8);
    95. memset((u8 *)SPI_RX_Buff,0,8);
    96. }
    97. void Init_All_Periph(void)
    98. {
    99. RCC_Configuration();
    100. //NVIC_Configuration();
    101. GPIO_Configuration();
    102. SPI_Configuration();
    103. }
    104. void TaskStart(void * pdata)
    105. {
    106. pdata = pdata;
    107. OS_ENTER_CRITICAL();
    108. OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
    109. OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
    110. OSTaskSuspend(START_TASK_Prio); //suspend but not delete
    111. OS_EXIT_CRITICAL();
    112. }
    113. void TaskLed(void *pdata)
    114. {
    115. GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    116. while(1)
    117. {
    118. SPI1_DMA_SendBytes();
    119. OSTimeDlyHMSM(0,0,0,300);
    120. }
    121. }
    122. void TaskLed1(void *pdata)
    123. {
    124. while(1)
    125. {
    126. /*led_on_or_off(pb_13,1);
    127. led_on_or_off(pb_14,1);
    128. OSTimeDlyHMSM(0,0,0,200);
    129. led_on_or_off(pb_13,0);
    130. led_on_or_off(pb_14,0);*/
    131. OSTimeDlyHMSM(0,0,0,200);
    132. }
    133. }
    134. void SysTick_Handler(void)
    135. {
    136. OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
    137. OSIntNesting++;
    138. OS_EXIT_CRITICAL();
    139. OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
    140. OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
    141. }
    142. void SysTick_Configuration(void)
    143. {
    144. SysTick->CTRL&=~(1<<2);
    145. SysTick->CTRL|=1<<1;
    146. SysTick ->LOAD=9000;
    147. SysTick->CTRL|=1<<0;
    148. }
    149. int main(void)
    150. {
    151. Init_All_Periph();
    152. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    153. delay_init();
    154. SysTick_Configuration();
    155. OSInit();
    156. OSTaskCreate( TaskStart,
    157. (void *)0,
    158. (OS_STK *)&TASK_START_STK[START_STK_SIZE-1],
    159. START_TASK_Prio );
    160. OSStart();
    161. return 0;
    162. }

    从机

    1. 

    1. 从机SPI2通信:
    2. #include "spi.h"
    3. #define SPI_SPEED SPI_BaudRatePrescaler_128
    4. volatile uint8_t SPI2_TxBuf[9];
    5. volatile uint8_t SPI_RX_Buff[9];
    6. void SPI2_Init(void)
    7. {
    8. NVIC_InitTypeDef NVIC_InitStructure;
    9. GPIO_InitTypeDef GPIO_InitStructure;
    10. SPI_InitTypeDef SPI_InitStructure;
    11. DMA_InitTypeDef DMA_InitStructure;
    12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
    13. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    14. RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1, ENABLE);
    15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15;
    16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    18. GPIO_Init(GPIOB, &GPIO_InitStructure);
    19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPD;
    21. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    22. GPIO_Init(GPIOB, &GPIO_InitStructure);
    23. GPIO_SetBits(GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
    24. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    25. SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
    26. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    27. SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    28. SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    29. SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
    30. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_SPEED;
    31. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    32. SPI_InitStructure.SPI_CRCPolynomial = 7;
    33. NVIC_InitStructure.NVIC_IRQChannel=SPI2_IRQn;
    34. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    35. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    36. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    37. NVIC_Init(&NVIC_InitStructure);
    38. SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
    39. SPI_Init(SPI2, &SPI_InitStructure);
    40. //SPI2-TX-DMA
    41. DMA_DeInit(DMA1_Channel5);
    42. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;
    43. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_TxBuf;
    44. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    45. DMA_InitStructure.DMA_BufferSize = 9;
    46. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    47. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    48. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    49. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    50. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    51. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    52. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    53. DMA_Init(DMA1_Channel5, &DMA_InitStructure);
    54. //SPI2-RX-DMA
    55. DMA_DeInit(DMA1_Channel4);
    56. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;
    57. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI_RX_Buff;
    58. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    59. DMA_InitStructure.DMA_BufferSize = 9;
    60. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    61. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    62. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    63. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    64. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    65. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    66. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    67. DMA_Init(DMA1_Channel4, &DMA_InitStructure);
    68. DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
    69. NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
    70. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    71. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    72. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    73. NVIC_Init(&NVIC_InitStructure);
    74. SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
    75. SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE);
    76. SPI_Cmd(SPI2, ENABLE);
    77. SPI2->DR;
    78. }
    79. //SPI ËÙ¶ÈÉèÖú¯Êý
    80. //SpeedSet:
    81. //SPI_SPEED_2 2·ÖƵ (SPI 12M --sys 24M)
    82. //SPI_SPEED_8 8·ÖƵ (SPI 3M --sys 24M)
    83. //SPI_SPEED_16 16·ÖƵ (SPI 1.5M --sys 24M)
    84. //SPI_SPEED_256 256·ÖƵ (SPI 905.6K --sys 24M)
    85. void SPI2_SetSpeed(u8 SpeedSet)
    86. {
    87. SPI2->CR1&=0XFFC7;//Fsck=Fcpu/256
    88. if(SpeedSet==SPI_SPEED_2)//¶þ·ÖƵ
    89. {
    90. SPI2->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz
    91. }
    92. else if(SpeedSet==SPI_SPEED_8)//°Ë·ÖƵ
    93. {
    94. SPI2->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
    95. }
    96. else if(SpeedSet==SPI_SPEED_16)//Ê®Áù·ÖƵ
    97. {
    98. SPI2->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
    99. }
    100. else //256·ÖƵ
    101. {
    102. SPI2->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz µÍËÙģʽ
    103. }
    104. SPI2->CR1|=1<<6; //SPIÉ豸ʹÄÜ
    105. }
    106. u8 SPI2_ReadWriteByte(u8 TxData)
    107. {
    108. u8 retry=0;
    109. while((SPI2->SR&1<<1)==0)//µÈ´ý·¢ËÍÇø¿Õ
    110. {
    111. retry++;
    112. if(retry>200)return 0;
    113. }
    114. SPI2->DR=TxData; //·¢ËÍÒ»¸öbyte
    115. retry=0;
    116. while((SPI2->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte
    117. {
    118. retry++;
    119. if(retry>200)return 0;
    120. }
    121. return SPI2->DR; //·µ»ØÊÕµ½µÄÊý¾Ý
    122. }
    123. u8 SPI2_ReadByte(u8 TxData)
    124. {
    125. u8 retry=0;
    126. while((SPI2->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte
    127. {
    128. retry++;
    129. if(retry>200)return 0;
    130. }
    131. return SPI2->DR; //·µ»ØÊÕµ½µÄÊý¾Ý
    132. }

    2. 

    1. #include "sys.h" //ϵͳ×Óº¯Êý
    2. #include "delay.h" //ÑÓʱ×Óº¯Êý
    3. #include "spi.h"
    4. #include <stdlib.h>
    5. #include <string.h>
    6. extern volatile uint8_t SPI2_TxBuf[9];
    7. extern volatile uint8_t SPI_RX_Buff[9];
    8. uint8_t rev_data[9];
    9. u8 buff = 0;
    10. u8 Slave_Temp=0;
    11. int count =0 ;
    12. void SPI2_Init(void); //³õʼ»¯SPI¿Ú
    13. void SPI2_SetSpeed(u8 SpeedSet); //ÉèÖÃSPIËÙ¶È
    14. u8 SPI2_ReadWriteByte(u8 TxData);
    15. void spi_send_read(void);
    16. //PB13 SPI2_SCK
    17. //PB14 SPI2_MISO
    18. //PB15 SPI2_MOSI
    19. int main(void)
    20. {
    21. SystemInit();
    22. delay_init(72); //ÑÓʱ³õʼ»¯
    23. NVIC_Configuration();
    24. SPI2_Init(); //SPI2³õʼ»¯
    25. while(1)
    26. {
    27. delay_ms(100);
    28. }
    29. }
    30. void DMA1_Channel4_IRQHandler(){//SPI2-RX-DMA
    31. if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET){
    32. DMA_ClearFlag(DMA1_FLAG_TC4);
    33. //memset((u8 *)SPI_RX_Buff,0,8);
    34. SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
    35. }
    36. }
    37. void DMA1_Channel5_IRQHandler(){//SPI2-TX-DMA
    38. if(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET){
    39. DMA_ClearFlag(DMA1_FLAG_TC5);
    40. }
    41. }
    42. void SPI2_IRQHandler(void)
    43. {
    44. u8 work_up;
    45. if((SPI2->SR&1<<0)==1) {
    46. // buff = SPI2->DR;
    47. SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
    48. spi_send_read();
    49. buff = SPI2->DR;
    50. }
    51. }
    52. void spi_send_read(){
    53. DMA_Cmd(DMA1_Channel5, DISABLE);
    54. DMA_Cmd(DMA1_Channel4, DISABLE);
    55. DMA_SetCurrDataCounter(DMA1_Channel5, 9);
    56. DMA_SetCurrDataCounter(DMA1_Channel4, 9);
    57. DMA_ClearFlag(DMA1_FLAG_GL5|DMA1_FLAG_TC5|DMA1_FLAG_HT5|DMA1_FLAG_TE5);
    58. DMA_ClearFlag(DMA1_FLAG_GL4|DMA1_FLAG_TC4|DMA1_FLAG_HT4|DMA1_FLAG_TE4);
    59. DMA_Cmd(DMA1_Channel5, ENABLE);
    60. DMA_Cmd(DMA1_Channel4, ENABLE);
    61. memcpy(rev_data,(u8 *)SPI_RX_Buff,9);
    62. }

  • 相关阅读:
    【应用程序启动过程-三种加载控制器的方式-上午内容复习 Objective-C语言】
    峰会实录 | 镜舟科技CEO孙文现:基于StarRocks打造企业级极速统一数据分析产品
    神经网络结构图怎么看的,神经网络结果图如何看
    Go 存储系列:B+树存储引擎 boltdb
    spring aop
    ObjectProvider学习
    OSPF——基本概念2(多区域与Vlink)
    【Android笔记20】Android中的字符串、颜色、尺寸等资源的介绍及使用
    Java优先级队列(堆)
    Linux内核开发 | Linux内核目录结构分析(5.4.32)
  • 原文地址:https://blog.csdn.net/momodenglu/article/details/132838105