mod_spi.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "mod_spi.h"
  2. #include "mod_candataprocess.h"
  3. #include "mod_sys.h"
  4. #include "sys_queue.h"
  5. #include "sys_log.h"
  6. #include "sys_crc.h"
  7. #include "sys_common.h"
  8. #include "string.h"
  9. #include "hal_spi.h"
  10. #define BLE_CONFIG_BUF_LEN 32
  11. static uint16_t g_s_tlen = 0;
  12. static uint16_t g_s_clen = 0;
  13. static uint8_t g_s_ble_config[BLE_CONFIG_BUF_LEN];
  14. static spi_send_callback_fp g_s_spi_send_callback = NULL;
  15. void MOD_SpiDataProcess(uint8_t* data, uint8_t data_len)
  16. {
  17. SPI_HEADER_T* pHeader = (SPI_HEADER_T*)data;
  18. uint16_t check_crc = 0, pack_crc;
  19. uint8_t pack_len;
  20. uint8_t pack_cmd;
  21. uint8_t header_len = sizeof(SPI_HEADER_T);
  22. uint8_t crc_index;
  23. uint8_t ver = 0;
  24. pack_cmd = pHeader->message_code;
  25. pack_len = pHeader->len;
  26. crc_index = header_len-2+pack_len-3;
  27. check_crc = UTIL_CRC(&data[2], crc_index);
  28. memcpy(&pack_crc, &data[crc_index+2], 2);
  29. small_big_transfer16(&pack_crc);
  30. if(check_crc != pack_crc)
  31. {
  32. return;
  33. }
  34. DLOG_I("spi_rx_data:%s,len:%d", SYS_Hex2str((uint8_t* )data, data_len), data_len);
  35. if(pack_cmd == BLE_CMD_VER)
  36. {
  37. ver = data[4];
  38. DLOG_I("BLE_CMD_VER");
  39. DLOG_I("ble ver:0x%x", ver);
  40. MOD_SpiSetBleConfig();
  41. }
  42. else if(pack_cmd == BLE_CMD_CFG)
  43. {
  44. DLOG_I("BLE_CMD_CFG");
  45. }
  46. else if(pack_cmd == BLE_CMD_TRANSFER)
  47. {
  48. DLOG_I("BLE_CMD_TRANSFER");
  49. if(data[4] == TRANSFER_GET_CAN_CMD)
  50. {
  51. DLOG_I("send_can_data_cmd");
  52. MOD_CanTransferData(&data[5], pack_len-3-1);
  53. }
  54. }
  55. else if(pack_cmd == BLE_CMD_CONNECT)
  56. {
  57. DLOG_I("BLE_CMD_CONNECT");
  58. }
  59. else if(pack_cmd == BLE_CMD_DISCONNECT)
  60. {
  61. DLOG_I("BLE_CMD_DISCONNECT");
  62. }
  63. else if(pack_cmd == BLE_CMD_TEST)
  64. {
  65. ver = data[4];
  66. DLOG_I("BLE_CMD_TEST");
  67. DLOG_I("get ble ver:0x%x", ver);
  68. }
  69. }
  70. void MOD_SpiDataSendCallbackRegister(spi_send_callback_fp fp)
  71. {
  72. g_s_spi_send_callback = fp;
  73. }
  74. void MOD_SpiDataSend(uint8_t cmd, uint8_t*data, uint8_t len)
  75. {
  76. uint8_t send_buf[QUEUE_MAX_DATA_LEN] = {0};
  77. int pack_len = 0;
  78. uint16_t crc;
  79. uint16_t header_len = sizeof(SPI_HEADER_T);
  80. SPI_HEADER_T* pHeader = (SPI_HEADER_T*)send_buf;
  81. memset(send_buf, 0, QUEUE_MAX_DATA_LEN);
  82. pHeader->ident[0] = SPI_DATA_IDENT;
  83. pHeader->ident[1] = SPI_DATA_IDENT;
  84. pHeader->len = 3 + len;
  85. pHeader->message_code = cmd;
  86. if ((len>0)&&(len<QUEUE_MAX_DATA_LEN-2-header_len))
  87. {
  88. memcpy(&send_buf[header_len], data, len);
  89. }
  90. crc = UTIL_CRC(&send_buf[2], header_len-2+len);
  91. send_buf[header_len + len] = (crc >> 8) & 0xFF;
  92. send_buf[header_len + len + 1] = crc & 0xFF;
  93. pack_len = header_len+len+2;
  94. DLOG_I("spi_tx_data:%s,len:%d", SYS_Hex2str(send_buf, pack_len), pack_len);
  95. if(NULL != g_s_spi_send_callback)
  96. {
  97. g_s_spi_send_callback(send_buf, QUEUE_MAX_DATA_LEN);
  98. }
  99. }
  100. int MOD_SpiSetBleConfig(void)
  101. {
  102. uint8_t ble_mac[6] = {0};
  103. uint8_t ble_name[10] = {0};
  104. uint32_t ble_adv_interval = 0;
  105. uint8_t* p_name = NULL;
  106. uint8_t ble_name_len = 0;
  107. memset(ble_mac, 0, 6);
  108. memcpy(ble_mac, (uint8_t* )MOD_SysGetPara(PARA_BLE_MAC), 6);
  109. DLOG_I("set ble_mac:%X%X%X%X%X%X", ble_mac[0],ble_mac[1],ble_mac[2],ble_mac[3],ble_mac[4],ble_mac[5]);
  110. memset(ble_name, 0, 10);
  111. p_name = (uint8_t* )MOD_SysGetPara(PARA_BLE_NAME);
  112. ble_name_len = strlen(p_name);
  113. memcpy(ble_name, p_name, ble_name_len);
  114. DLOG_I("set ble_name:%s,len:%d", ble_name, ble_name_len);
  115. ble_adv_interval = *(uint32_t* )MOD_SysGetPara(PARA_BLE_ADV_INTERVAL);
  116. DLOG_I("set ble_adv_interval:%d", ble_adv_interval);
  117. MOD_SpiTlvInit(g_s_ble_config, BLE_CONFIG_BUF_LEN);
  118. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_MAC, 6, ble_mac);
  119. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_ADV_NAME, ble_name_len, ble_name);
  120. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_ADV_INTERVAL, 4, &ble_adv_interval);
  121. MOD_SpiDataSend(BLE_CMD_CFG, g_s_ble_config, MOD_SpiTlvGetLen());
  122. return 0;
  123. }
  124. uint16_t srv_ble_byte_2_short(uint8_t* bytes)
  125. {
  126. uint16_t result = bytes[1] & 0xFF;
  127. result |= ((bytes[0] << 8) & 0xFF00);
  128. return result;
  129. }
  130. uint16_t MOD_SpiTlvGetLen(void)
  131. {
  132. return g_s_clen;
  133. }
  134. void MOD_SpiTlvInit(uint8_t *buf, uint16_t len)
  135. {
  136. g_s_tlen = len;
  137. g_s_clen = 0;
  138. memset(buf, 0, len);
  139. }
  140. uint16_t MOD_SpiTlvGetValue(uint16_t id, void* input ,uint16_t inputLen, void* output)
  141. {
  142. uint8_t* tmp;
  143. uint16_t curr = 0;
  144. uint16_t len = 0;
  145. uint8_t* end;
  146. tmp = input;
  147. end = (uint8_t*)input + inputLen;
  148. while (tmp + 4 <= end)
  149. {
  150. curr = srv_ble_byte_2_short(tmp);
  151. tmp += 2;
  152. len = srv_ble_byte_2_short(tmp);
  153. tmp += 2;
  154. if( tmp + len > end )
  155. return 0;
  156. if (curr == id)
  157. {
  158. memcpy(output, tmp, len);
  159. return len;
  160. }
  161. tmp += len;
  162. }
  163. return 0;
  164. }
  165. void MOD_SpiTlvSetValue(uint8_t *buf, uint16_t id, uint16_t size, void *value)
  166. {
  167. if(g_s_clen + size + 4 > g_s_tlen)
  168. {
  169. DLOG_E("tlv buffer is too small[%d]", g_s_clen + size + 4);
  170. return;
  171. }
  172. buf[g_s_clen++] = (id >> 8) & 0xFF;
  173. buf[g_s_clen++] = id & 0xFF;
  174. buf[g_s_clen++] = (size >> 8) & 0xFF;
  175. buf[g_s_clen++] = size & 0xFF;
  176. memcpy(buf + g_s_clen, value, size);
  177. g_s_clen += size;
  178. }