|
|
@ -38,5 +38,68 @@ void Hardware::debug_light_periodicJob() { |
|
|
|
/*******************************************************************************
|
|
|
|
* CAN * |
|
|
|
*******************************************************************************/ |
|
|
|
void Hardware::can_init() {} |
|
|
|
void Hardware::can_periodicJob() {} |
|
|
|
void Hardware::can_init() { |
|
|
|
// 初始化CAN接收过滤器
|
|
|
|
CAN_FilterTypeDef CAN_FilterInitStructure; |
|
|
|
CAN_FilterInitStructure.FilterActivation = ENABLE; // 使能过滤器
|
|
|
|
CAN_FilterInitStructure.FilterBank = 1; // 指定过滤器为1
|
|
|
|
CAN_FilterInitStructure.FilterMode = CAN_FILTERMODE_IDMASK; // 指定过滤器为标识符屏蔽位模式
|
|
|
|
CAN_FilterInitStructure.FilterScale = CAN_FILTERSCALE_32BIT; // 过滤器位宽为32位
|
|
|
|
CAN_FilterInitStructure.FilterFIFOAssignment = CAN_FILTER_FIFO0; // 设定了指向过滤器的FIFO
|
|
|
|
|
|
|
|
CAN_FilterInitStructure.FilterIdHigh = 0x0000; // 要过滤的ID高位
|
|
|
|
CAN_FilterInitStructure.FilterIdLow = 0x0000; // 要过滤的ID低位
|
|
|
|
CAN_FilterInitStructure.FilterMaskIdHigh = 0x0000; // 过滤器屏蔽标识符的高16位值
|
|
|
|
CAN_FilterInitStructure.FilterMaskIdLow = 0x0000; // 过滤器屏蔽标识符的低16位值
|
|
|
|
HAL_CAN_ConfigFilter(&hcan1, &CAN_FilterInitStructure); |
|
|
|
// 启动CAN
|
|
|
|
HAL_CAN_MspInit(&hcan1); |
|
|
|
HAL_CAN_Start(&hcan1); |
|
|
|
can_HeaderTypedef_set(); |
|
|
|
} |
|
|
|
void Hardware::can_HeaderTypedef_set() { |
|
|
|
m_can.Can_Tx.StdId = 0x123; |
|
|
|
m_can.Can_Tx.ExtId = 0x123; |
|
|
|
m_can.Can_Tx.IDE = 0; |
|
|
|
m_can.Can_Tx.RTR = 0; |
|
|
|
m_can.Can_Tx.DLC = 8; |
|
|
|
|
|
|
|
m_can.Can_Rx.StdId = 0x321; |
|
|
|
m_can.Can_Rx.ExtId = 0x321; |
|
|
|
m_can.Can_Rx.IDE = 0; |
|
|
|
m_can.Can_Rx.RTR = 0; |
|
|
|
m_can.Can_Rx.DLC = 8; |
|
|
|
} |
|
|
|
void Hardware::can_send(uint8_t *data, uint8_t len) { |
|
|
|
{ |
|
|
|
static uint32_t lastprocess = 0; |
|
|
|
if (sys_haspassedms(lastprocess) > 3000) { |
|
|
|
lastprocess = HAL_GetTick(); |
|
|
|
ZLOGI(TAG, "CAN TX data: %02x %02x %02x %02x %02x %02x %02x %02x", //
|
|
|
|
data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0]); |
|
|
|
HAL_CAN_AddTxMessage(&hcan1, &m_can.Can_Tx, m_can.tdata, &m_can.pTxMailbox); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
void Hardware::can_receive(uint8_t *data, uint8_t len) { |
|
|
|
if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &m_can.Can_Rx, m_can.adata) == HAL_OK) { |
|
|
|
ZLOGI(TAG, "CAN RX buffer: %02x %02x %02x %02x %02x %02x %02x %02x", //
|
|
|
|
m_can.adata[7], m_can.adata[6], m_can.adata[5], m_can.adata[4], m_can.adata[3], m_can.adata[2], m_can.adata[1], m_can.adata[0]); |
|
|
|
} |
|
|
|
} |
|
|
|
void Hardware::can_periodicJob() { |
|
|
|
// 装载CAN字段
|
|
|
|
can_HeaderTypedef_set(); |
|
|
|
// 发送can消息
|
|
|
|
m_can.tdata[0] = 0x01; |
|
|
|
m_can.tdata[1] = 0x02; |
|
|
|
m_can.tdata[2] = 0x03; |
|
|
|
m_can.tdata[3] = 0x04; |
|
|
|
m_can.tdata[4] = 0x05; |
|
|
|
m_can.tdata[5] = 0x06; |
|
|
|
m_can.tdata[6] = 0x07; |
|
|
|
m_can.tdata[7] = 0x08; |
|
|
|
can_send(m_can.tdata, 8); |
|
|
|
// 查询接收can消息,并通过UART1 打印接收到的CAN消息报文
|
|
|
|
can_receive(m_can.adata, 8); |
|
|
|
} |