AngleSensor.c 3.7 KB

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