can.h
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:15k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : can.h
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : This file contains all the functions prototypes for the
  6. *                      CAN bus software library.
  7. ********************************************************************************
  8. * History:
  9. *  01/01/2004 : V1.2
  10. *  14/07/2004 : V1.3
  11. *******************************************************************************/
  12. #ifndef __can_H
  13. #define __can_H
  14. #include "71x_lib.h"
  15. // Standard bitrates available
  16. enum
  17. {
  18.   CAN_BITRATE_100K,
  19.   CAN_BITRATE_125K,
  20.   CAN_BITRATE_250K,
  21.   CAN_BITRATE_500K,
  22.   CAN_BITRATE_1M
  23. };
  24. // Control register
  25. #define CAN_CR_TEST 0x0080
  26. #define CAN_CR_CCE 0x0040
  27. #define CAN_CR_DAR 0x0020
  28. #define CAN_CR_EIE 0x0008
  29. #define CAN_CR_SIE 0x0004
  30. #define CAN_CR_IE 0x0002
  31. #define CAN_CR_INIT 0x0001
  32. // Status register
  33. #define CAN_SR_LEC 0x0007
  34. #define CAN_SR_TXOK 0x0008
  35. #define CAN_SR_RXOK 0x0010
  36. #define CAN_SR_EPASS 0x0020
  37. #define CAN_SR_EWARN 0x0040
  38. #define CAN_SR_BOFF 0x0080
  39. // Test register
  40. #define CAN_TESTR_RX 0x0080
  41. #define CAN_TESTR_TX1 0x0040
  42. #define CAN_TESTR_TX0 0x0020
  43. #define CAN_TESTR_LBACK 0x0010
  44. #define CAN_TESTR_SILENT 0x0008
  45. #define CAN_TESTR_BASIC 0x0004
  46. // IFn / Command Request register
  47. #define CAN_CRR_BUSY 0x8000
  48. // IFn / Command Mask register
  49. #define CAN_CMR_WRRD 0x0080
  50. #define CAN_CMR_MASK 0x0040
  51. #define CAN_CMR_ARB 0x0020
  52. #define CAN_CMR_CONTROL 0x0010
  53. #define CAN_CMR_CLRINTPND 0x0008
  54. #define CAN_CMR_TXRQST 0x0004
  55. #define CAN_CMR_DATAA 0x0002
  56. #define CAN_CMR_DATAB 0x0001
  57. // IFn / Mask 2 register
  58. #define CAN_M2R_MXTD 0x8000
  59. #define CAN_M2R_MDIR 0x4000
  60. // IFn / Arbitration 2 register
  61. #define CAN_A2R_MSGVAL 0x8000
  62. #define CAN_A2R_XTD 0x4000
  63. #define CAN_A2R_DIR 0x2000
  64. // IFn / Message Control register
  65. #define CAN_MCR_NEWDAT 0x8000
  66. #define CAN_MCR_MSGLST 0x4000
  67. #define CAN_MCR_INTPND 0x2000
  68. #define CAN_MCR_UMASK 0x1000
  69. #define CAN_MCR_TXIE 0x0800
  70. #define CAN_MCR_RXIE 0x0400
  71. #define CAN_MCR_RMTEN 0x0200
  72. #define CAN_MCR_TXRQST 0x0100
  73. #define CAN_MCR_EOB 0x0080
  74. // Wake-up modes
  75. enum
  76. {
  77.   CAN_WAKEUP_ON_EXT,
  78.   CAN_WAKEUP_ON_CAN
  79. };
  80. // CAN message structure
  81. typedef struct
  82. {
  83.   u32 IdType;
  84.   vu32 Id;
  85.   vu8 Dlc;
  86.   vu8 Data[8];
  87. } canmsg;
  88. // message ID types
  89. enum
  90. {
  91.   CAN_STD_ID,
  92.   CAN_EXT_ID
  93. };
  94. // message ID limits
  95. #define CAN_LAST_STD_ID ((1<<11) - 1)
  96. #define CAN_LAST_EXT_ID ((1L<<29) - 1)
  97. /*******************************************************************************
  98. * Function Name  : CAN_EnterInitMode
  99. * Description    : Switch the CAN into initialization mode
  100. * Input 1        : any binary value formed from the CAN_CR_xxx defines
  101. * Output         : None
  102. * Return         : None
  103. * Note           : CAN_LeaveInitMode must be called when all is done
  104. *******************************************************************************/
  105. inline void CAN_EnterInitMode(u8 mask)
  106. {
  107. CAN->CR = mask | CAN_CR_INIT;
  108. CAN->SR = 0; // reset the status
  109. }
  110. /*******************************************************************************
  111. * Function Name  : CAN_LeaveInitMode
  112. * Description    : Leave the initialization mode (switch into normal mode)
  113. * Input          : None
  114. * Output         : None
  115. * Return         : None
  116. *******************************************************************************/
  117. inline void CAN_LeaveInitMode(void)
  118. {
  119. CAN->CR &= ~(CAN_CR_INIT | CAN_CR_CCE);
  120. }
  121. /*******************************************************************************
  122. * Function Name  : CAN_EnterTestMode
  123. * Description    : Switch the CAN into test mode
  124. * Input 1        : any binary value formed from the CAN_TESTR_xxx defines
  125. * Output         : None
  126. * Return         : None
  127. * Note           : CAN_LeaveTestMode must be called when all is done
  128. *******************************************************************************/
  129. inline void CAN_EnterTestMode(u8 mask)
  130. {
  131. CAN->CR |= CAN_CR_TEST;
  132. CAN->TESTR |= mask;
  133. }
  134. /*******************************************************************************
  135. * Function Name  : CAN_LeaveTestMode
  136. * Description    : Leave the current test mode (switch into normal mode)
  137. * Input          : None
  138. * Output         : None
  139. * Return         : None
  140. *******************************************************************************/
  141. inline void CAN_LeaveTestMode(void)
  142. {
  143. CAN->CR |= CAN_CR_TEST;
  144. CAN->TESTR &= ~(CAN_TESTR_LBACK | CAN_TESTR_SILENT | CAN_TESTR_BASIC);
  145. CAN->CR &= ~CAN_CR_TEST;
  146. }
  147. /*******************************************************************************
  148. * Function Name  : CAN_SetBitrate
  149. * Description    : Setup a standard CAN bitrate
  150. * Input 1        : one of the CAN_BITRATE_xxx defines
  151. * Output         : None
  152. * Return         : None
  153. * Note           : CAN must be in initialization mode
  154. *******************************************************************************/
  155. void CAN_SetBitrate(u32 bitrate);
  156. /*******************************************************************************
  157. * Function Name  : CAN_SetTiming
  158. * Description    : Setup the CAN timing with specific parameters
  159. * Input 1        : Time Segment before the sample point position, from 1 to 16
  160. * Input 2        : Time Segment after the sample point position, from 1 to 8
  161. * Input 3        : Synchronisation Jump Width, from 1 to 4
  162. * Input 4        : Baud Rate Prescaler, from 1 to 1024
  163. * Output         : None
  164. * Return         : None
  165. * Note           : CAN must be in initialization mode
  166. *******************************************************************************/
  167. void CAN_SetTiming(u32 tseg1, u32 tseg2, u32 sjw, u32 brp);
  168. /*******************************************************************************
  169. * Function Name  : CAN_SleepRequest
  170. * Description    : Request the CAN cell to enter sleep mode
  171. * Input 1        : CAN_WAKEUP_ON_EXT or CAN_WAKEUP_ON_CAN
  172. * Output         : None
  173. * Return         : None
  174. *******************************************************************************/
  175. void CAN_SleepRequest(u32 WakeupMode);
  176. /*******************************************************************************
  177. * Function Name  : CAN_SetUnusedMsgObj
  178. * Description    : Configure the message object as unused
  179. * Input 1        : message object number, from 0 to 31
  180. * Output         : None
  181. * Return         : None
  182. *******************************************************************************/
  183. void CAN_SetUnusedMsgObj(u32 msgobj);
  184. /*******************************************************************************
  185. * Function Name  : CAN_SetTxMsgObj
  186. * Description    : Configure the message object as TX
  187. * Input 1        : message object number, from 0 to 31
  188. * Input 2        : CAN_STD_ID or CAN_EXT_ID
  189. * Output         : None
  190. * Return         : None
  191. *******************************************************************************/
  192. void CAN_SetTxMsgObj(u32 msgobj, u32 idType);
  193. /*******************************************************************************
  194. * Function Name  : CAN_SetRxMsgObj
  195. * Description    : Configure the message object as RX
  196. * Input 1        : message object number, from 0 to 31
  197. * Input 2        : CAN_STD_ID or CAN_EXT_ID
  198. * Input 3        : low part of the identifier range used for acceptance filtering
  199. * Input 4        : high part of the identifier range used for acceptance filtering
  200. * Input 5        : TRUE for a single receive object or a FIFO receive object that
  201. *                  is the last one of the FIFO
  202. *                  FALSE for a FIFO receive object that is not the last one
  203. * Output         : None
  204. * Return         : None
  205. *******************************************************************************/
  206. void CAN_SetRxMsgObj(u32 msgobj, u32 idType, u32 idLow, u32 idHigh, bool singleOrFifoLast);
  207. /*******************************************************************************
  208. * Function Name  : CAN_InvalidateAllMsgObj
  209. * Description    : Configure all the message objects as unused
  210. * Input          : None
  211. * Output         : None
  212. * Return         : None
  213. *******************************************************************************/
  214. void CAN_InvalidateAllMsgObj(void);
  215. /*******************************************************************************
  216. * Function Name  : CAN_Init
  217. * Description    : Initialize the CAN cell and set the bitrate
  218. * Input 1        : any binary value formed from the CAN_CTL_xxx defines
  219. * Input 2        : one of the CAN_BITRATE_xxx defines
  220. * Output         : None
  221. * Return         : None
  222. *******************************************************************************/
  223. void CAN_Init(u8 mask, u32 bitrate);
  224. /*******************************************************************************
  225. * Function Name  : CAN_ReleaseMessage
  226. * Description    : Release the message object
  227. * Input 1        : message object number, from 0 to 31
  228. * Output         : None
  229. * Return         : None
  230. *******************************************************************************/
  231. void CAN_ReleaseMessage(u32 msgobj);
  232. /*******************************************************************************
  233. * Function Name  : CAN_ReleaseTxMessage
  234. * Description    : Release the transmit message object
  235. * Input 1        : message object number, from 0 to 31
  236. * Output         : None
  237. * Return         : None
  238. * Note           : assume that message interface 0 is free
  239. *******************************************************************************/
  240. inline void CAN_ReleaseTxMessage(u32 msgobj)
  241. {
  242. CAN->sMsgObj[0].CMR = CAN_CMR_CLRINTPND | CAN_CMR_TXRQST;
  243. CAN->sMsgObj[0].CRR = 1 + msgobj;
  244. }
  245. /*******************************************************************************
  246. * Function Name  : CAN_ReleaseRxMessage
  247. * Description    : Release the receive message object
  248. * Input 1        : message object number, from 0 to 31
  249. * Output         : None
  250. * Return         : None
  251. * Note           : assume that message interface 1 is free
  252. *******************************************************************************/
  253. inline void CAN_ReleaseRxMessage(u32 msgobj)
  254. {
  255. CAN->sMsgObj[1].CMR = CAN_CMR_CLRINTPND | CAN_CMR_TXRQST;
  256. CAN->sMsgObj[1].CRR = 1 + msgobj;
  257. }
  258. /*******************************************************************************
  259. * Function Name  : CAN_SendMessage
  260. * Description    : Start transmission of a message
  261. * Input 1        : message object number, from 0 to 31
  262. * Input 2        : pointer to the message structure containing data to transmit
  263. * Output         : None
  264. * Return         : 1 if transmission was OK, else 0
  265. *******************************************************************************/
  266. u32  CAN_SendMessage(u32 msgobj, canmsg* pCanMsg);
  267. /*******************************************************************************
  268. * Function Name  : CAN_ReceiveMessage
  269. * Description    : Get the message, if received
  270. * Input 1        : message object number, from 0 to 31
  271. * Input 2        : if TRUE, the message object is released when getting the data
  272. *                  if FALSE, the message object is not released
  273. * Input 3        : pointer to the message structure where received data is stored
  274. * Output         : None
  275. * Return         : 1 if reception was OK, else 0 (no message pending)
  276. *******************************************************************************/
  277. u32  CAN_ReceiveMessage(u32 msgobj, bool release, canmsg* pCanMsg);
  278. /*******************************************************************************
  279. * Function Name  : CAN_WaitEndOfTx
  280. * Description    : Wait until current transmission is finished
  281. * Input          : None
  282. * Output         : None
  283. * Return         : None
  284. *******************************************************************************/
  285. void CAN_WaitEndOfTx(void);
  286. /*******************************************************************************
  287. * Function Name  : CAN_BasicSendMessage
  288. * Description    : Start transmission of a message in BASIC mode
  289. * Input 1        : pointer to the message structure containing data to transmit
  290. * Output         : None
  291. * Return         : 1 if transmission was OK, else 0
  292. * Note           : CAN must be in BASIC mode
  293. *******************************************************************************/
  294. u32 CAN_BasicSendMessage(canmsg* pCanMsg);
  295. /*******************************************************************************
  296. * Function Name  : CAN_BasicReceiveMessage
  297. * Description    : Get the message in BASIC mode, if received
  298. * Input 1        : pointer to the message structure where received data is stored
  299. * Output         : None
  300. * Return         : 1 if reception was OK, else 0 (no message pending)
  301. * Note           : CAN must be in BASIC mode
  302. *******************************************************************************/
  303. u32 CAN_BasicReceiveMessage(canmsg* pCanMsg);
  304. /*******************************************************************************
  305. * Function Name  : CAN_IsMessageWaiting
  306. * Description    : Test the waiting status of a received message
  307. * Input 1        : message object number, from 0 to 31
  308. * Output         : None
  309. * Return         : A non-zero value if the corresponding message object has
  310. *                  received a message waiting to be copied, else 0
  311. *******************************************************************************/
  312. inline u32 CAN_IsMessageWaiting(u32 msgobj)
  313. {
  314.   return (msgobj < 16 ? CAN->ND1R & (1 << msgobj) : CAN->ND2R & (1 << (msgobj-16)));
  315. }
  316. /*******************************************************************************
  317. * Function Name  : CAN_IsTransmitRequested
  318. * Description    : Test the request status of a transmitted message
  319. * Input 1        : message object number, from 0 to 31
  320. * Output         : None
  321. * Return         : A non-zero value if the corresponding message is requested
  322. *                  to transmit, else 0
  323. *******************************************************************************/
  324. inline u32 CAN_IsTransmitRequested(u32 msgobj)
  325. {
  326.   return (msgobj < 16 ? CAN->TR1R & (1 << msgobj) : CAN->TR2R & (1 << (msgobj-16)));
  327. }
  328. /*******************************************************************************
  329. * Function Name  : CAN_IsInterruptPending
  330. * Description    : Test the interrupt status of a message object
  331. * Input 1        : message object number, from 0 to 31
  332. * Output         : None
  333. * Return         : A non-zero value if the corresponding message has an interrupt
  334. *                  pending, else 0
  335. *******************************************************************************/
  336. inline u32 CAN_IsInterruptPending(u32 msgobj)
  337. {
  338.   return (msgobj < 16 ? CAN->IP1R & (1 << msgobj) : CAN->IP2R & (1 << (msgobj-16)));
  339. }
  340. /*******************************************************************************
  341. * Function Name  : CAN_IsObjectValid
  342. * Description    : Test the validity of a message object (ready to use)
  343. * Input 1        : message object number, from 0 to 31
  344. * Output         : None
  345. * Return         : A non-zero value if the corresponding message object is valid,
  346. *                  else 0
  347. *******************************************************************************/
  348. inline u32 CAN_IsObjectValid(u32 msgobj)
  349. {
  350.   return (msgobj < 16 ? CAN->MV1R & (1 << msgobj) : CAN->MV2R & (1 << (msgobj-16)));
  351. }
  352. #endif /* __can_H */
  353. /******************* (C) COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/