luat_can.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #ifndef LUAT_CAN_H
  2. #define LUAT_CAN_H
  3. #include "luat_base.h"
  4. /**
  5. * 不明确的部分参考SJA1000
  6. */
  7. /**
  8. * @brief can总线工作模式
  9. */
  10. typedef enum LUAT_CAN_WORK_MODE
  11. {
  12. LUAT_CAN_WORK_MODE_NORMAL,/**< 正常收发 */
  13. LUAT_CAN_WORK_MODE_ONLY_LISTEN,/**< 监听模式,一般用于自适应时序 */
  14. LUAT_CAN_WORK_MODE_SELF_TEST,/**< 自收自发,仅用于测试 */
  15. LUAT_CAN_WORK_MODE_SLEEP,/**< 休眠模式,只能被接收唤醒 */
  16. }LUAT_CAN_WORK_MODE_E;
  17. /**
  18. * @brief can节点状态
  19. */
  20. typedef enum LUAT_CAN_STATE
  21. {
  22. LUAT_CAN_STOP, /**< 未工作状态 */
  23. LUAT_CAN_ACTIVE_ERROR,/**< 主动错误 */
  24. LUAT_CAN_PASSIVE_ERROR,/**< 被动错误 */
  25. LUAT_CAN_BUS_OFF,/**< 总线关闭 */
  26. LUAT_CAN_ONLY_LISTEN,/**< 监听状态 */
  27. LUAT_CAN_SELF_TEST,/**< 自测试状态 */
  28. LUAT_CAN_SLEEP, /**< 休眠状态 */
  29. }LUAT_CAN_STATE_E;
  30. /**
  31. * @brief can中断回调
  32. */
  33. typedef enum LUAT_CAN_CB
  34. {
  35. LUAT_CAN_CB_NEW_MSG,/**< 有新的消息到来 */
  36. LUAT_CAN_CB_TX_OK,/**< 发送成功 */
  37. LUAT_CAN_CB_TX_FAILED,/**< 发送失败 */
  38. LUAT_CAN_CB_ERROR_REPORT,/**< 总线错误报告 */
  39. LUAT_CAN_CB_STATE_CHANGE,/**< 总线状态变更 */
  40. }LUAT_CAN_CB_E;
  41. typedef struct
  42. {
  43. uint32_t id:30; //消息ID
  44. uint32_t is_extend:1; //是否是扩展帧ID
  45. uint32_t RTR:1; //是否是遥控帧
  46. uint8_t len; //数据长度
  47. uint8_t data[8]; //数据
  48. }luat_can_message_t;
  49. /**
  50. * @brief 回调函数
  51. *
  52. */
  53. typedef void (*luat_can_callback_t)(int can_id, LUAT_CAN_CB_E cb_type, void *cb_param);
  54. /**
  55. * @brief can总线基础初始化
  56. *
  57. * @param can_id 总线序号,如果只有一条,填0,有多条的根据实际情况填写
  58. * @param rx_msg_cache_max 最大接收消息缓存数量,如果写0则是使用平台默认值
  59. * @return 0成功,其他失败
  60. */
  61. int luat_can_base_init(uint8_t can_id, uint32_t rx_msg_cache_max);
  62. /**
  63. * @brief 设置中断回调
  64. *
  65. * @param can_id 总线序号,如果只有一条,填0,有多条的根据实际情况填写
  66. * @param callback 回调函数
  67. * @return 0成功,其他失败
  68. */
  69. int luat_can_set_callback(uint8_t can_id, luat_can_callback_t callback);
  70. /**
  71. * @brief 设置can总线工作模式,一般情况下应设置LUAT_CAN_WORK_MODE_NORMAL
  72. * @param can_id 总线序号,如果只有一条,填0,有多条的根据实际情况填写
  73. * @param mode 工作模式
  74. * @return 0成功,其他失败
  75. */
  76. int luat_can_set_work_mode(uint8_t can_id, LUAT_CAN_WORK_MODE_E mode);
  77. /**
  78. * @brief 设置can总线时序
  79. * @param can_id 总线序号
  80. * @param bit_rate 期望波特率
  81. * @param PTS 传播时间段,范围1~8
  82. * @param PBS1 相位缓冲段1,范围1~8
  83. * @param PBS2 相位缓冲段2,范围2~8
  84. * @param SJW 同步补偿宽度值,范围1~4
  85. * @return 0成功,其他失败
  86. */
  87. int luat_can_set_timing(uint8_t can_id, uint32_t bit_rate, uint8_t PTS, uint8_t PBS1, uint8_t PBS2, uint8_t SJW);
  88. /**
  89. * @brief 设置can总线节点id,即只接收完全匹配node_id的消息
  90. * @param can_id 总线序号
  91. * @param node_id 节点id,标准格式11位或者扩展格式29位,根据is_extend决定,id值越小,优先级越高
  92. * @param is_extend_id 是否为扩展模式的ID号,写0标准格式11位,写1扩展格式29位
  93. * @return 0成功,其他失败
  94. */
  95. int luat_can_set_node(uint8_t can_id, uint32_t node_id, uint8_t is_extend_id);
  96. /**
  97. * @brief 设置can总线接收消息的过滤模式,当luat_can_set_node不能满足时使用才使用这个函数,过滤模式比较复杂,请参考SJA1000的Pelican模式下滤波
  98. * @param can_id 总线序号
  99. * @param is_dual_mode 是否为双过滤模式,0否,1是
  100. * @param ACR 接收代码寄存器,一共4个
  101. * @param AMR 接收屏蔽码,一共4个,对应bit写0表示需要检测,写1表示不检测,如果需要接收全部消息,AMR写0xffffffff
  102. * @return 0成功,其他失败
  103. */
  104. int luat_can_set_filter(uint8_t can_id, uint8_t is_dual_mode, uint8_t ACR[4], uint8_t AMR[4]);
  105. /**
  106. * @brief 往数据总线上发送一个消息,类型为数据帧或者遥控帧
  107. * @param can_id 总线序号
  108. * @param message_id 帧ID,标准格式11位或者扩展格式29位,根据is_extend_id决定
  109. * @param is_extend_id 是否是扩展帧ID,写0标准格式11位,写1扩展格式29位
  110. * @param is_RTR,是否是遥控帧,0不是,1是
  111. * @param need_ack,是否需要应答,0不需要,只发送1次,1需要,如果没有应答,会有发送失败回调
  112. * @param data_len,帧数据区长度0~8
  113. * @param data,帧数据
  114. * @return 0成功,其他失败
  115. */
  116. int luat_can_tx_message(uint8_t can_id, uint32_t message_id, uint8_t is_extend_id, uint8_t is_RTR, uint8_t need_ack, uint8_t data_len, const void *data);
  117. /**
  118. * @brief 停止未完成的消息发送
  119. * @param can_id 总线序号
  120. * @return 0成功,其他失败,没有正在发送的消息也返回成功
  121. */
  122. int luat_can_tx_stop(uint8_t can_id);
  123. /**
  124. * @brief 从接收缓存里读出1条消息
  125. * @param can_id 总线序号
  126. * @param message 消息
  127. * @return >=0成功,其他失败,当没有消息时返回0
  128. */
  129. int luat_can_rx_message_from_cache(uint8_t can_id, luat_can_message_t *message);
  130. /**
  131. * @brief can总线复位,一般用于从总线关闭状态恢复成主动错误
  132. * @param can_id 总线序号
  133. * @return
  134. */
  135. int luat_can_reset(uint8_t can_id);
  136. /**
  137. * @brief 完全关闭can总线
  138. * @param can_id 总线序号
  139. * @return 0成功,其他失败
  140. */
  141. int luat_can_close(uint8_t can_id);
  142. /**
  143. * @brief 获取当前can状态
  144. * @param can_id 总线序号
  145. * @return >=0 成功并返回状态值,其他失败,状态值见LUAT_CAN_STATE_E
  146. */
  147. int luat_can_get_state(uint8_t can_id);
  148. /**
  149. * @brief 设置STB脚输出电平
  150. * @param can_id 总线序号
  151. * @param on_off 0低电平,其他高电平
  152. * @return 0成功,其他失败
  153. */
  154. int luat_can_set_stb_io_level(uint8_t can_id, uint8_t on_off);
  155. /**
  156. * @brief 设置CAN控制器进入bus off状态
  157. * @param can_id 总线序号
  158. * @return 0成功,其他失败
  159. */
  160. int luat_can_bus_off(uint8_t can_id);
  161. /**
  162. * @brief 获取CAN控制器的时钟特性
  163. * @param can_id 总线序号
  164. * @param clk 基础时钟
  165. * @param div_min 分频系数最小值
  166. * @param div_max 分频系数最大值
  167. * @param div_step 分频系数步进值
  168. * @return 0成功,其他失败
  169. */
  170. int luat_can_get_capacity(uint8_t can_id, uint32_t *clk, uint32_t *div_min, uint32_t *div_max, uint32_t *div_step);
  171. uint32_t luat_can_get_last_error(uint8_t can_id);
  172. /**
  173. * @brief 设置CAN的debug状态
  174. * @param on_off 0关闭,1开启
  175. * @return 无
  176. */
  177. void luat_can_set_debug(uint8_t on_off);
  178. #endif