AngleSensor.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "gpio.h"
  4. #include "AngleSensor.h"
  5. #define DATA_SIZE 6U
  6. /*! SPI发送和接收数组*/
  7. uint8_t g_spiTxBuff1[DATA_SIZE] = {0};
  8. uint8_t g_spiRxBuff1[DATA_SIZE] = {0};
  9. /*************<prototype>**************/
  10. void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara);
  11. void AngleSensor_Init(void)
  12. {
  13. SPI_ConfigType spiConfig;
  14. /*初始化SPI引脚,功能复用选择.*/
  15. //GPIO_SetFunc(GPIOB, GPIO_PIN15, GPIO_FUN3);//SCK
  16. //GPIO_SetFunc(GPIOB, GPIO_PIN14, GPIO_FUN3);//MOSI
  17. //GPIO_SetFunc(GPIOC, GPIO_PIN0, GPIO_FUN3);//MISO
  18. //GPIO_SetFunc(GPIOC, GPIO_PIN1, GPIO_FUN3);//CS
  19. /*清零配置结构体变量.*/
  20. memset(&spiConfig, 0x00, sizeof(spiConfig));
  21. /*初始化SPI参数,波特率 = 2Mbps = (F_BCLK / (SCK_LOW+1 + SCK_HIGH+1)).*/
  22. spiConfig.csSetup = 4;/*片选建立时间 = (CS_SETUP + 1) * CLK_PERIOD.*/
  23. spiConfig.csHold = 4;/*片选保持时间 = (CS_HOLD + 1) * CLK_PERIOD.*/
  24. spiConfig.sckHigh = 5;/*SCK高电平时间 = (SCK_HIGH + 1) * CLK_PERIOD.*/
  25. spiConfig.sckLow = 5;/*SCK低电平时间 = (SCK_LOW + 1) * CLK_PERIOD.*/
  26. spiConfig.csIdle = 3;/*两条数据间最短时间间隔 = (CS_IDLE + 1) * CLK_PERIOD.*/
  27. spiConfig.mode = SPI_MASTER;//设置为主机模式
  28. spiConfig.cpha = SPI_CPHA_2EDGE;//设置数据采样相位,第2个边沿采样数据
  29. spiConfig.cpol = SPI_CPOL_LOW;//设置SCK空闲时极性,空闲时SCK为低
  30. spiConfig.frmSize = SPI_FRAME_SIZE_16BITS;
  31. spiConfig.rxMsbFirstEn = ENABLE;//选择从最高位开始接收
  32. spiConfig.txMsbFirstEn = ENABLE;//选择从最高位开始发送
  33. spiConfig.csOutputEn = ENABLE;//CS有SPI硬件控制
  34. spiConfig.continuousCSEn= ENABLE;//片选连续模式
  35. spiConfig.dmaRxEn = DISABLE;//禁止使用DMA接收数据
  36. spiConfig.dmaTxEn = DISABLE;//禁止使用DMA发送数据
  37. spiConfig.modeFaultEn = DISABLE;//模式故障禁止
  38. spiConfig.wakeUpEn = DISABLE;//主机模式不支持唤醒功能
  39. spiConfig.spiEn = ENABLE;
  40. spiConfig.callBack = SPI0_Callback;
  41. spiConfig.interruptEn = ENABLE;//使能NVIC中断
  42. spiConfig.txUFInterruptEn = ENABLE;//打开TXUF中断,可禁止
  43. spiConfig.rxOFInterruptEn = ENABLE;//打开RXOF中断,可禁止
  44. spiConfig.modeFaultInterruptEn = DISABLE;//模式故障中断
  45. SPI_Init(SPI0, &spiConfig);
  46. while(AngleSensor_GetAngle() < 0){
  47. mdelay(5);
  48. }
  49. }
  50. float AngleSensor_GetAngle(void)
  51. {
  52. uint16_t angle_value;
  53. //uint8_t safeword =0;
  54. //uint8_t crc;
  55. float angle = 0.0;
  56. g_spiTxBuff1[0] = 0x21;
  57. g_spiTxBuff1[1] = 0x80;
  58. g_spiTxBuff1[2] = 0xFF;
  59. g_spiTxBuff1[3] = 0xFF;
  60. g_spiTxBuff1[4] = 0xFF;
  61. g_spiTxBuff1[5] = 0xFF;
  62. SPI_TransmitReceivePoll(SPI0, g_spiRxBuff1, g_spiTxBuff1, 6);
  63. angle_value = g_spiRxBuff1[3]&0x7F;
  64. //printf("g_spiRxBuff1[2]:0x%x, g_spiRxBuff1[3]:0x%x \r\n", g_spiRxBuff1[2], g_spiRxBuff1[3]);
  65. //printf("g_spiRxBuff1[4]:0x%x, g_spiRxBuff1[5]:0x%x \r\n", g_spiRxBuff1[4], g_spiRxBuff1[5]);
  66. angle_value = (angle_value<<8)|g_spiRxBuff1[2];
  67. angle = (360.0*angle_value)/32768;
  68. if((g_spiRxBuff1[5]&0xF0) != 0x70){
  69. angle = -180.0;
  70. }
  71. return angle;
  72. }
  73. void AngleSensor_PrintInfo(void)
  74. {
  75. printf("AngleSensor angle:%f \r\n", AngleSensor_GetAngle());
  76. }
  77. void AngleSensor_DeInit(void)
  78. {
  79. SPI_DeInit(SPI0);
  80. }
  81. /**
  82. * @prototype SPI1_Callback(void *device, uint32_t wpara, uint32_t lpara)
  83. *
  84. * @param[in] ...
  85. * @return void
  86. *
  87. * @brief SPI1中断回调函数.
  88. */
  89. void SPI0_Callback(void *device, uint32_t wpara, uint32_t lpara)
  90. {
  91. if (wpara & SPI_STATUS_TXUF_Msk)
  92. {
  93. //TX下溢处理
  94. }
  95. else if (wpara & SPI_STATUS_RXOF_Msk)
  96. {
  97. //RX溢出处理
  98. }
  99. }