Imu.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2016. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */
  33. #include "ac780x_uart_reg.h"
  34. #include "ac780x_gpio.h"
  35. #include "Imu.h"
  36. #include "crc16.h"
  37. #include "uart.h"
  38. #include "string.h"
  39. #define UARTx UART2
  40. #define UARTx_IRQn UART2_IRQn
  41. #define UART_RX_BUFF_LENGTH 16
  42. uint8_t g_imuRxDataBuff[UART_RX_BUFF_LENGTH];
  43. uint16_t g_imuRxDataIndex;
  44. uint8_t *g_imuTxDataPoint;
  45. uint16_t g_imuTxDataLength;
  46. uint16_t g_imuTxDataIndex;
  47. static uint8_t imucmd_buffer[7];
  48. static uint8_t init_finished = 0;
  49. static float roll_angle = 0;
  50. static float pitch_angle = 0;
  51. static float yaw_angle = 0;
  52. //static int16_t tmp =0;
  53. //static uint32_t printfBuff[16];
  54. //static uint16_t printfLen = 0;
  55. static int TransmitData(uint8_t *pdata, uint16_t length);
  56. /**
  57. * UartEventCallback
  58. *
  59. * @param[in] device: UART_Type pointer
  60. * @param[in] wpara: UART lsr0 register
  61. * @param[in] lpara: UART lsr1 register
  62. * @return none
  63. *
  64. * @brief uart receive handle
  65. */
  66. static void UartEventCallback(void *device, uint32_t wpara, uint32_t lpara)
  67. {
  68. int16_t tmp = 0;
  69. UART_Type *uart_Device = (UART_Type *)device;
  70. /*rx interrupt*/
  71. if ((uart_Device->IER & UART_IER_ERXNE_Msk) && (wpara & UART_LSR0_DR_Msk))
  72. {
  73. //data = uart_Device->RBR;
  74. g_imuRxDataBuff[g_imuRxDataIndex++] = uart_Device->RBR;
  75. if (g_imuRxDataIndex >= 11)
  76. {
  77. g_imuRxDataIndex = 0;
  78. if(1 == init_finished){
  79. tmp = g_imuRxDataBuff[3];
  80. tmp = (tmp<<8)|g_imuRxDataBuff[2];
  81. roll_angle = 1.0*tmp/32768*180;
  82. tmp = g_imuRxDataBuff[5];
  83. tmp = (tmp<<8)|g_imuRxDataBuff[4];
  84. pitch_angle = 1.0*tmp/32768*180;
  85. tmp = g_imuRxDataBuff[7];
  86. tmp = (tmp<<8)|g_imuRxDataBuff[6];
  87. yaw_angle = 1.0*tmp/32768*180;
  88. // printfLen = snprintf((char*)printfBuff, 64, "Imu roll: %f, pitch:%f, yaw:%f \r\n", roll_angle, pitch_angle, yaw_angle);
  89. // rs485_TransmitData((uint8_t*)printfBuff, printfLen);
  90. }
  91. }
  92. }
  93. /*tx interrupt*/
  94. if ((uart_Device->IER & UART_IER_ETXE_Msk) && (wpara & UART_LSR0_THRE_Msk))
  95. {
  96. uart_Device->RBR = g_imuTxDataPoint[g_imuTxDataIndex++];
  97. if (g_imuTxDataIndex >= g_imuTxDataLength)
  98. {
  99. UART_SetTXEInterrupt(device, DISABLE); ///<发送最后一个字节时关闭发送空中断
  100. }
  101. }
  102. }
  103. /**
  104. * uart_Initialize
  105. *
  106. * @param[in] none
  107. * @return none
  108. *
  109. * @brief uart 初始化
  110. */
  111. static void uart_Initialize(void)
  112. {
  113. UART_ConfigType uartConfig = {0};
  114. //set pin mux
  115. // GPIO_SetFunc(GPIOB, GPIO_PIN9, GPIO_FUN3);
  116. // GPIO_SetFunc(GPIOB, GPIO_PIN10, GPIO_FUN3);
  117. uartConfig.baudrate = 9600;
  118. uartConfig.dataBits = UART_WORD_LEN_8BIT;
  119. uartConfig.stopBits = UART_STOP_1BIT;
  120. uartConfig.parity = UART_PARI_NO;
  121. uartConfig.fifoByteEn = DISABLE; ///<must enable fifoByte when use DMA
  122. uartConfig.dmaEn = UART_DMA_TXRX_NONE;
  123. uartConfig.callBack = UartEventCallback; ///<uart2 interrupt callback
  124. UART_Init(UARTx, &uartConfig);
  125. UART_SetRXNEInterrupt(UARTx, ENABLE);
  126. ///Enable UARTx interrupt
  127. NVIC_SetPriority(UARTx_IRQn, 3);
  128. NVIC_ClearPendingIRQ(UARTx_IRQn);
  129. NVIC_EnableIRQ(UARTx_IRQn);
  130. }
  131. /**
  132. * TransmitData
  133. *
  134. * @param[in] pdata :发送数据指针
  135. * @param[in] length :发送数据长度
  136. * @return none
  137. *
  138. * @brief uart 发送函数,通过中断发送
  139. */
  140. int TransmitData(uint8_t *pdata, uint16_t length)
  141. {
  142. if (g_imuTxDataIndex < g_imuTxDataLength)
  143. {
  144. return -1; ///<有数据正在发送
  145. }
  146. g_imuTxDataPoint = pdata;
  147. g_imuTxDataLength = length;
  148. g_imuTxDataIndex = 0;
  149. UART_SetTXEInterrupt(UARTx, ENABLE);
  150. return 0;
  151. }
  152. void Imu_Init(void)
  153. {
  154. uint16_t crc;
  155. uart_Initialize();
  156. //设置参数
  157. imucmd_buffer[0] = 0xFF;
  158. imucmd_buffer[1] = 0xAA;
  159. //step1 解锁
  160. imucmd_buffer[2] = 0x69;
  161. imucmd_buffer[3] = 0x88;
  162. imucmd_buffer[4] = 0xB5;
  163. crc = crc16(imucmd_buffer, 5);
  164. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  165. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  166. TransmitData(imucmd_buffer, 7);
  167. //step2 设置输出内容
  168. imucmd_buffer[2] = 0x02;
  169. imucmd_buffer[3] = 0x08;
  170. imucmd_buffer[4] = 0x00;
  171. crc = crc16(imucmd_buffer, 5);
  172. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  173. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  174. TransmitData(imucmd_buffer, 7);
  175. //step3 设置单次回传
  176. imucmd_buffer[2] = 0x03;
  177. imucmd_buffer[3] = 0x0C;
  178. imucmd_buffer[4] = 0x00;
  179. crc = crc16(imucmd_buffer, 5);
  180. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  181. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  182. TransmitData(imucmd_buffer, 7);
  183. init_finished = 1;
  184. }
  185. uint8_t Imu_MR(void)
  186. {
  187. uint16_t crc;
  188. imucmd_buffer[0] = 0xFF;
  189. imucmd_buffer[1] = 0xAA;
  190. imucmd_buffer[2] = 0x03;
  191. imucmd_buffer[3] = 0x0C;
  192. imucmd_buffer[4] = 0x00;
  193. crc = crc16(imucmd_buffer, 5);
  194. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  195. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  196. TransmitData(imucmd_buffer, 7);
  197. g_imuRxDataIndex = 0;
  198. return 0;
  199. }
  200. uint8_t Imu_GetAngle(float* roll, float* pitch, float* yaw)
  201. {
  202. *roll = roll_angle;
  203. *pitch = pitch_angle;
  204. *yaw = yaw_angle;
  205. return 0;
  206. }
  207. uint8_t Imu_Print(void)
  208. {
  209. }
  210. void Imu_DeInit(void)
  211. {
  212. }