Imu.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. #include <math.h>
  40. #define UARTx UART2
  41. #define UARTx_IRQn UART2_IRQn
  42. #define UART_RX_BUFF_LENGTH 16
  43. uint8_t g_imuRxDataBuff[UART_RX_BUFF_LENGTH];
  44. uint16_t g_imuRxDataIndex;
  45. uint8_t *g_imuTxDataPoint;
  46. uint16_t g_imuTxDataLength;
  47. uint16_t g_imuTxDataIndex;
  48. static uint8_t imucmd_buffer[7];
  49. static uint8_t init_finished = 0;
  50. static float roll_angle = 0;
  51. static float pitch_angle = 0;
  52. static float yaw_angle = 0;
  53. static uint8_t imu_dataError_count = 0;
  54. //static int16_t print_times =0;
  55. //static uint32_t printfBuff[16];
  56. //static uint16_t printfLen = 0;
  57. static int TransmitData(uint8_t *pdata, uint16_t length);
  58. /**
  59. * UartEventCallback
  60. *
  61. * @param[in] device: UART_Type pointer
  62. * @param[in] wpara: UART lsr0 register
  63. * @param[in] lpara: UART lsr1 register
  64. * @return none
  65. *
  66. * @brief uart receive handle
  67. */
  68. static void UartEventCallback(void *device, uint32_t wpara, uint32_t lpara)
  69. {
  70. int16_t tmp = 0;
  71. uint8_t sum = 0;
  72. uint8_t i =0;
  73. UART_Type *uart_Device = (UART_Type *)device;
  74. /*rx interrupt*/
  75. if ((uart_Device->IER & UART_IER_ERXNE_Msk) && (wpara & UART_LSR0_DR_Msk))
  76. {
  77. //data = uart_Device->RBR;
  78. g_imuRxDataBuff[g_imuRxDataIndex++] = uart_Device->RBR;
  79. if (g_imuRxDataIndex >= 11)
  80. {
  81. g_imuRxDataIndex = 0;
  82. for( i=0; i<10; i++){
  83. sum += g_imuRxDataBuff[i];
  84. }
  85. if(1 == init_finished){
  86. if((sum == g_imuRxDataBuff[10]) && (0x55 == g_imuRxDataBuff[0]) && (0x53 == g_imuRxDataBuff[1])){
  87. tmp = g_imuRxDataBuff[3];
  88. tmp = (tmp<<8)|g_imuRxDataBuff[2];
  89. roll_angle = 1.0*tmp/32768*180;
  90. tmp = g_imuRxDataBuff[5];
  91. tmp = (tmp<<8)|g_imuRxDataBuff[4];
  92. pitch_angle = 1.0*tmp/32768*180;
  93. tmp = g_imuRxDataBuff[7];
  94. tmp = (tmp<<8)|g_imuRxDataBuff[6];
  95. yaw_angle = 1.0*tmp/32768*180;
  96. imu_dataError_count = 0;
  97. }else{
  98. imu_dataError_count++;
  99. if(imu_dataError_count >= 5){
  100. imu_dataError_count = 3;
  101. roll_angle = -300;
  102. pitch_angle = -300;
  103. yaw_angle = -300;
  104. }
  105. }
  106. }
  107. }
  108. }
  109. /*tx interrupt*/
  110. if ((uart_Device->IER & UART_IER_ETXE_Msk) && (wpara & UART_LSR0_THRE_Msk))
  111. {
  112. uart_Device->RBR = g_imuTxDataPoint[g_imuTxDataIndex++];
  113. if (g_imuTxDataIndex >= g_imuTxDataLength)
  114. {
  115. UART_SetTXEInterrupt(device, DISABLE); ///<发送最后一个字节时关闭发送空中断
  116. }
  117. }
  118. }
  119. /**
  120. * uart_Initialize
  121. *
  122. * @param[in] none
  123. * @return none
  124. *
  125. * @brief uart 初始化
  126. */
  127. static void uart_Initialize(void)
  128. {
  129. UART_ConfigType uartConfig = {0};
  130. //set pin mux
  131. //GPIO_SetFunc(GPIOB, GPIO_PIN9, GPIO_FUN3);
  132. //GPIO_SetFunc(GPIOB, GPIO_PIN10, GPIO_FUN3);
  133. uartConfig.baudrate = 9600;
  134. uartConfig.dataBits = UART_WORD_LEN_8BIT;
  135. uartConfig.stopBits = UART_STOP_1BIT;
  136. uartConfig.parity = UART_PARI_NO;
  137. uartConfig.fifoByteEn = DISABLE; ///<must enable fifoByte when use DMA
  138. uartConfig.dmaEn = UART_DMA_TXRX_NONE;
  139. uartConfig.callBack = UartEventCallback; ///<uart2 interrupt callback
  140. UART_Init(UARTx, &uartConfig);
  141. UART_SetRXNEInterrupt(UARTx, ENABLE);
  142. ///Enable UARTx interrupt
  143. NVIC_SetPriority(UARTx_IRQn, 3);
  144. NVIC_ClearPendingIRQ(UARTx_IRQn);
  145. NVIC_EnableIRQ(UARTx_IRQn);
  146. }
  147. /**
  148. * TransmitData
  149. *
  150. * @param[in] pdata :发送数据指针
  151. * @param[in] length :发送数据长度
  152. * @return none
  153. *
  154. * @brief uart 发送函数,通过中断发送
  155. */
  156. int TransmitData(uint8_t *pdata, uint16_t length)
  157. {
  158. if (g_imuTxDataIndex < g_imuTxDataLength)
  159. {
  160. return -1; ///<有数据正在发送
  161. }
  162. g_imuTxDataPoint = pdata;
  163. g_imuTxDataLength = length;
  164. g_imuTxDataIndex = 0;
  165. UART_SetTXEInterrupt(UARTx, ENABLE);
  166. return 0;
  167. }
  168. void Imu_Init(void)
  169. {
  170. uint16_t crc;
  171. uart_Initialize();
  172. mdelay(30);
  173. //设置参数
  174. imucmd_buffer[0] = 0xFF;
  175. imucmd_buffer[1] = 0xAA;
  176. //step1 解锁
  177. imucmd_buffer[2] = 0x69;
  178. imucmd_buffer[3] = 0x88;
  179. imucmd_buffer[4] = 0xB5;
  180. crc = crc16(imucmd_buffer, 5);
  181. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  182. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  183. TransmitData(imucmd_buffer, 7);
  184. mdelay(100);
  185. //step2 设置输出内容 ,仅输出角度
  186. imucmd_buffer[2] = 0x02;
  187. imucmd_buffer[3] = 0x08;
  188. imucmd_buffer[4] = 0x00;
  189. crc = crc16(imucmd_buffer, 5);
  190. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  191. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  192. TransmitData(imucmd_buffer, 7);
  193. mdelay(100);
  194. //step3 设置单次回传
  195. imucmd_buffer[2] = 0x03;
  196. imucmd_buffer[3] = 0x0C;
  197. imucmd_buffer[4] = 0x00;
  198. crc = crc16(imucmd_buffer, 5);
  199. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  200. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  201. TransmitData(imucmd_buffer, 7);
  202. init_finished = 1;
  203. }
  204. uint8_t Imu_MR(void)
  205. {
  206. uint16_t crc;
  207. imucmd_buffer[0] = 0xFF;
  208. imucmd_buffer[1] = 0xAA;
  209. imucmd_buffer[2] = 0x03;
  210. imucmd_buffer[3] = 0x0C;
  211. imucmd_buffer[4] = 0x00;
  212. crc = crc16(imucmd_buffer, 5);
  213. imucmd_buffer[5] = (uint8_t)((crc>>8) & 0x00ff);
  214. imucmd_buffer[6] = (uint8_t)(crc & 0x00ff);
  215. g_imuRxDataIndex = 0;
  216. TransmitData(imucmd_buffer, 7);
  217. return 0;
  218. }
  219. uint8_t Imu_GetAngle(float* roll, float* pitch, float* yaw)
  220. {
  221. UART_SetRXNEInterrupt(UARTx, DISABLE);
  222. *roll = roll_angle;
  223. *pitch = pitch_angle;
  224. *yaw = yaw_angle;
  225. UART_SetRXNEInterrupt(UARTx, ENABLE);
  226. return 0;
  227. }
  228. uint8_t Imu_Print(void)
  229. {
  230. }
  231. void Imu_DeInit(void)
  232. {
  233. }