/****************************************Copyright (c)**************************************************** ** Guangzhou ZHIYUAN electronics Co.,LTD. ** ** http://www.embedtools.com ** **--------------File Info--------------------------------------------------------------------------------- ** File name: main.c ** Last modified Date: 2009-05-12 ** Last Version: V1.01 ** Descriptions: The main() function example template ** **-------------------------------------------------------------------------------------------------------- ** Created by: Chengmingji ** Created date: 2009-07-24 ** Version: V1.00 ** Descriptions: 添加用户应用程序 ** **-------------------------------------------------------------------------------------------------------- ** Modified by: LiangBaoqiong ** Modified date: 2010-6-1 ** Version: ** Descriptions: 编写CAN数据收发示例代码 ** ** Rechecked by: *********************************************************************************************************/ #include "..\config.h" /********************************************************************************************************* CAN 报文结构与变量定义 *********************************************************************************************************/ #define CAN_MSGOBJ_STD 0x00000000UL /* CAN 2.0a 11-bit ID */ #define CAN_MSGOBJ_EXT 0x20000000UL /* CAN 2.0b 29-bit ID */ #define CAN_MSGOBJ_DAT 0x00000000UL /* data frame */ #define CAN_MSGOBJ_RTR 0x40000000UL /* rtr frame */ /* * CAN报文结构体定义 */ typedef struct _CAN_MSG_OBJ { INT32U mode_id; INT32U mask; INT8U data[8]; INT8U dlc; INT8U msgobj; }CAN_MSG_OBJ; /********************************************************************************************************* CANOpen 报文结构与变量定义 *********************************************************************************************************/ typedef struct _CAN_ODCONSTENTRY { INT16U index; INT8U subindex; INT8U len; INT32U val; }CAN_ODCONSTENTRY; /* * upper-nibble values for CAN_ODENTRY.entrytype_len */ #define OD_NONE 0x00 /* Object Dictionary entry doesn't exist */ #define OD_EXP_RO 0x10 /* Object Dictionary entry expedited, read-only */ #define OD_EXP_WO 0x20 /* Object Dictionary entry expedited, write-only*/ #define OD_EXP_RW 0x30 /* Object Dictionary entry expedited, read-write*/ #define OD_SEG_RO 0x40 /* Object Dictionary entry segmented, read-only */ #define OD_SEG_WO 0x50 /* Object Dictionary entry segmented, write-only*/ #define OD_SEG_RW 0x60 /* Object Dictionary entry segmented, read-write*/ typedef struct _CAN_ODENTRY { INT16U index; INT8U subindex; INT8U entrytype_len; INT8U *val; }CAN_ODENTRY; typedef struct _CAN_CANOPENCFG { INT8U node_id; INT8U msgobj_rx; INT8U msgobj_tx; INT32U od_const_num; CAN_ODCONSTENTRY *od_const_table; INT32U od_num; CAN_ODENTRY *od_table; }CAN_CANOPENCFG; /* * CAN回调函数声明 */ typedef struct _CAN_CALLBACKS { void (*CAN_rx)(INT8U msg_obj); void (*CAN_tx)(INT8U msg_obj); void (*CAN_error)(INT32U error_info); INT32U (*CANOPEN_sdo_read)(INT16U index, INT8U subindex); INT32U (*CANOPEN_sdo_write)( INT16U index, INT8U subindex, INT8U *dat_ptr); INT32U (*CANOPEN_sdo_seg_read)( INT16U index, INT8U subindex, INT8U openclose, INT8U *length, INT8U *data, INT8U *last); INT32U (*CANOPEN_sdo_seg_write)( INT16U index, INT8U subindex, INT8U openclose, INT8U length, INT8U *data, INT8U *fast_resp); INT8U (*CANOPEN_sdo_req)( INT8U length_req, INT8U *req_ptr, INT8U *length_resp, INT8U *resp_ptr); }CAN_CALLBACKS; /* * CAN固件函数结构体 */ typedef struct _CAND { void (*init_can) (INT32U * can_cfg); void (*isr) (void); void (*config_rxmsgobj) (CAN_MSG_OBJ * msg_obj); INT8U (*can_receive) (CAN_MSG_OBJ * msg_obj); void (*can_transmit) (CAN_MSG_OBJ * msg_obj); void (*config_canopen) (CAN_CANOPENCFG * canopen_cfg); void (*canopen_handler) (void); void (*config_calb) (CAN_CALLBACKS * callback_cfg); }CAND; /* * ROM中CAN固件地址 */ typedef struct _ROM { const unsigned p_usbd; const unsigned p_clib; const CAND * pCANAPI; const unsigned p_pwrd; const unsigned p_dev1; const unsigned p_dev2; const unsigned p_dev3; const unsigned p_dev4; }ROM; /********************************************************************************************************* 函数声明 *********************************************************************************************************/ void CAN_rx(INT8U msg_obj_num); void CAN_tx(INT8U msg_obj_num); /********************************************************************************************************* 变量定义与初始化 *********************************************************************************************************/ ROM **rom = (ROM**)0x1fff1ff8; /* 指向固件地址的指针 */ CAN_MSG_OBJ msg_obj; /* 定义CAN报文变量 */ /* * 波特率与时钟初始化 */ INT32U CanApiClkInitTable[2] = { 0x00000000UL, /* CANCLKDIV */ 0x00007EC3UL /* CANBTR */ }; /* * 注册回调函数 */ const CAN_CALLBACKS callbacks = { CAN_rx, CAN_tx, }; /********************************************************************************************************* ** Function name: myDelay ** Descriptions: 软件延时 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void myDelay(INT32U ulTime) { INT32U i; i = 0; while (ulTime--) { for (i = 0; i < 5000; i++); } } /********************************************************************************************************* ** Function name: canIsr ** Descriptions: CAN中断 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void canIsr(void) { (*rom)->pCANAPI->isr(); } /********************************************************************************************************* ** Function name: CAN_rx ** Descriptions: 数据接收处理,将接收到的报文再发送出去 ** input parameters: msg_obj_num 待读取报文编号 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void CAN_rx(INT8U msg_obj_num) { CAN_MSG_OBJ msg_obj; msg_obj.msgobj = msg_obj_num; (*rom)->pCANAPI->can_receive(&msg_obj); msg_obj.msgobj = 5; (*rom)->pCANAPI->can_transmit(&msg_obj); /* 将接收到的数据回发出去 */ } /********************************************************************************************************* ** Function name: CAN_tx ** Descriptions: 发送数据处理 ** input parameters: msg_obj_num 待发送报文编号 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void CAN_tx(INT8U msg_obj_num) { msg_obj_num = msg_obj_num; } /********************************************************************************************************* ** Function name: main ** Descriptions: CAN数据收发,直接调用LPC11C14片上CAN 固件API函数,默认波特率为500kbps。 ** 基于TinyM0-CAN开发板 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ int main(void) { targetInit(); /* 初始化目标板,切勿删除 */ pinInit(); /* 引脚初始化 */ PRESETCTRL |= (1 << 3); SYSAHBCLKCTRL |= (1 << 17); (*rom)->pCANAPI->init_can(&CanApiClkInitTable[0]); zyIsrSet(NVIC_CAN, (unsigned long)canIsr, PRIO_ONE); (*rom)->pCANAPI->config_calb((CAN_CALLBACKS *)&callbacks); msg_obj.mask = 0x00L; /* 不屏蔽任何ID */ msg_obj.dlc = 8; msg_obj.msgobj = 4; (*rom)->pCANAPI-> config_rxmsgobj(&msg_obj); while (1) { myDelay(1000); } } /********************************************************************************************************* ** End Of File *********************************************************************************************************/