spi.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "gd32f10x.h"
  2. #include "spi.h"
  3. /*-------------------------------------------------*/
  4. /*函数名:SPI0初始化 */
  5. /*参 数:无 */
  6. /*返回值:无 */
  7. /*-------------------------------------------------*/
  8. void SPI0_Init(void){
  9. spi_parameter_struct spi_parameter; //初始化SPI的结构体
  10. rcu_periph_clock_enable(RCU_SPI0); //打开SPI0时钟
  11. rcu_periph_clock_enable(RCU_GPIOA); //打开GPIOA时钟
  12. gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_5|GPIO_PIN_7); //配置PA5和PA7
  13. gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_6); //配置PA6
  14. spi_i2s_deinit(SPI0); //复位SPI0
  15. spi_parameter.device_mode = SPI_MASTER; //主机模式
  16. spi_parameter.trans_mode = SPI_TRANSMODE_FULLDUPLEX; //双线双向全双工
  17. spi_parameter.frame_size = SPI_FRAMESIZE_8BIT; //数据宽度8位一个字节
  18. spi_parameter.nss = SPI_NSS_SOFT; //软件控制NSS
  19. spi_parameter.endian = SPI_ENDIAN_MSB; //从最高位开始传输
  20. spi_parameter.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; //模式0
  21. spi_parameter.prescale = SPI_PSC_2; //2分频
  22. spi_init(SPI0,&spi_parameter); //初始化SPI0
  23. spi_enable(SPI0); //打开SPI0
  24. }
  25. /*-------------------------------------------------*/
  26. /*函数名:SPI收发一个字节 */
  27. /*参 数:txd:要发送的数据 */
  28. /*返回值:接收到的数据 */
  29. /*-------------------------------------------------*/
  30. uint8_t SPI0_ReadWriteByte(uint8_t txd)
  31. {
  32. while(spi_i2s_flag_get(SPI0,SPI_FLAG_TBE)!=1); //等到发送缓冲区空
  33. spi_i2s_data_transmit(SPI0,txd); //填入数据
  34. while(spi_i2s_flag_get(SPI0,SPI_FLAG_RBNE)!=1); //等待接收缓冲区有数据
  35. return spi_i2s_data_receive(SPI0); //返回接收到的数据
  36. }
  37. /*-------------------------------------------------*/
  38. /*函数名:SPI发数据 */
  39. /*参 数:wdata:发送数据指针 datalen:发送长度 */
  40. /*返回值:无 */
  41. /*-------------------------------------------------*/
  42. void SPI0_Write(uint8_t *wdata, uint16_t datalen)
  43. {
  44. uint16_t i; //用于for循环
  45. for(i=0;i<datalen;i++){ //循环datalen次,一个字节一个字节发送
  46. SPI0_ReadWriteByte(wdata[i]); //发送一个字节数据
  47. }
  48. }
  49. /*-------------------------------------------------*/
  50. /*函数名:SPI接收数据 */
  51. /*参 数:rdata:接收缓冲区 datalen:接收长度 */
  52. /*返回值:无 */
  53. /*-------------------------------------------------*/
  54. void SPI0_Read(uint8_t *rdata, uint16_t datalen)
  55. {
  56. uint16_t i; //用于for循环
  57. for(i=0;i<datalen;i++){ //循环datalen次,一个字节一个字节接收
  58. rdata[i] = SPI0_ReadWriteByte(0xff); //接收保存一个字节数据
  59. }
  60. }