luat_can.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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, luat_can_callback_t callback);
  62. /**
  63. * @brief 设置can总线工作模式,一般情况下应设置LUAT_CAN_WORK_MODE_NORMAL
  64. * @param can_id 总线序号,如果只有一条,填0,有多条的根据实际情况填写
  65. * @param mode 工作模式
  66. * @return 0成功,其他失败
  67. */
  68. int luat_can_set_work_mode(uint8_t can_id, LUAT_CAN_WORK_MODE_E mode);
  69. /**
  70. * @brief 设置can总线时序
  71. * @param can_id 总线序号
  72. * @param bit_rate 期望波特率
  73. * @param PTS 传播时间段,范围1~8
  74. * @param PBS1 相位缓冲段1,范围1~8
  75. * @param PBS2 相位缓冲段2,范围2~8
  76. * @param SJW 同步补偿宽度值,范围1~4
  77. * @return 0成功,其他失败
  78. */
  79. 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);
  80. /**
  81. * @brief 设置can总线节点id,即只接收完全匹配node_id的消息
  82. * @param can_id 总线序号
  83. * @param node_id 节点id,标准格式11位或者扩展格式29位,根据is_extend决定
  84. * @param is_extend_id 是否为扩展模式的ID号,写0标准格式11位,写1扩展格式29位
  85. * @return 0成功,其他失败
  86. */
  87. int luat_can_set_node(uint8_t can_id, uint32_t node_id, uint8_t is_extend_id);
  88. /**
  89. * @brief 设置can总线接收消息的过滤模式,当luat_can_set_node不能满足时使用,过滤模式比较复杂,请参考SJA1000的Pelican模式下滤波
  90. * @param can_id 总线序号
  91. * @param is_dual_mode 是否为双过滤模式,0否,1是
  92. * @param ACR 接收代码寄存器,一共4个
  93. * @param AMR 接收屏蔽码,一共4个,对应bit写0表示需要检测,写1表示不检测,如果需要接收全部消息,AMR写0xffffffff
  94. * @return 0成功,其他失败
  95. */
  96. int luat_can_set_filter(uint8_t can_id, uint8_t is_dual_mode, uint8_t ACR[4], uint8_t AMR[4]);
  97. /**
  98. * @brief 往数据总线上发送一个消息,类型为数据帧或者遥控帧
  99. * @param can_id 总线序号
  100. * @param message_id 帧ID,标准格式11位或者扩展格式29位,根据is_extend_id决定
  101. * @param is_extend_id 是否是扩展帧ID,写0标准格式11位,写1扩展格式29位
  102. * @param is_RTR,是否是遥控帧,0不是,1是
  103. * @param need_ack,是否需要应答,0不需要,只发送1次,1需要,如果没有应答,会有发送失败回调
  104. * @param data_len,帧数据区长度0~8
  105. * @param data,帧数据
  106. * @return 0成功,其他失败
  107. */
  108. 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, uint8_t *data);
  109. /**
  110. * @brief 停止未完成的消息发送
  111. * @param can_id 总线序号
  112. * @return 0成功,其他失败,没有正在发送的消息也返回成功
  113. */
  114. int luat_can_tx_stop(uint8_t can_id);
  115. /**
  116. * @brief 从接收缓存里读出1条消息
  117. * @param can_id 总线序号
  118. * @param message 消息
  119. * @return >=0成功,其他失败,当没有消息时返回0
  120. */
  121. int luat_can_rx_message_from_cache(uint8_t can_id, luat_can_message_t *message);
  122. /**
  123. * @brief can总线从总线关闭状态恢复成主动错误
  124. * @param can_id 总线序号
  125. * @return
  126. */
  127. int luat_can_recovery_bus_off(uint8_t can_id);
  128. /**
  129. * @brief 完全关闭can总线
  130. * @param can_id 总线序号
  131. * @return 0成功,其他失败
  132. */
  133. int luat_can_close(uint8_t can_id);
  134. /**
  135. * @brief 获取当前can状态
  136. * @param can_id 总线序号
  137. * @return >=0 成功并返回状态值,其他失败,状态值见LUAT_CAN_STATE_E
  138. */
  139. int luat_cat_get_state(uint8_t can_id);
  140. #ifdef __LUATOS__
  141. int l_can_handler(lua_State *L, void* ptr);
  142. #endif
  143. #endif