(二)CAN通信协议代码-升级版

(⼆)CAN通信协议代码-升级版CAN代码-升级版
(1)can.c
#define CAN_BUS_ENABLE  1
#define CAN_BUS_DISABLE 0
#define CAN2_FILTER_S  14
typedef struct __can_gpio_pin_t{
uint32_t  pin_bit;
uint32_t gpio_rcc;
GPIO_TypeDef *gpio_port;
}can_gpio_pin_t;
typedef struct __send_status_t{
uint8_t mbox_s;
}send_status_t;
typedef struct _can_cfg_t{
uint8_t can_dev_id;
uint8_t pin_map;
uint8_t fifo_no;
uint8_t filter_start;
can_gpio_pin_t r_pin;
can_gpio_pin_t t_pin;
uint32_t can_rcc;
CAN_TypeDef* can_ch;
send_status_t txs;
uint8_t irq;
uint8_t it_flag;
uint8_t res[2];
}can_cfg_t;
/*--- 设置常⽤CAN波特率 ---*/
typedef struct __can_tq_t {
uint16_t can_baudrate;
uint16_t can_prescaler;
uint8_t can_syn_jump_width;
uint8_t can_time_bit_seg1;
uint8_t can_time_bit_seg2;
uint8_t can_res;
}can_tq_t;
static can_tq_t can_baud_array[]={
{5,400, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{10,200, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{20,100, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{40,50, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{50,40, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
cnki免费入口{80,25, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{100,20, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{125,16, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{200,10, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{250,36, CAN_SJW_2tq, CAN_BS1_2tq, CAN_BS2_1tq },
{400,5, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{500,4, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{666,3, CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_8tq },
{800,11, CAN_SJW_2tq, CAN_BS1_2tq, CAN_BS2_1tq },
{1000,9, CAN_SJW_2tq, CAN_BS1_2tq, CAN_BS2_1tq },
{0},
};
};
static can_cfg_t can_cfg[CAN_DEV_CNT]={
[CAN_DEV1]={
.can_dev_id = CAN_DEV1,
.fifo_no = CAN_Filter_FIFO0,
.t_pin ={ GPIO_Pin_12, RCC_APB2Periph_GPIOA, GPIOA },// CAN1_TX PA12 .r_pin ={ GPIO_Pin_11, RCC_APB2Periph_GPIOA, GPIOA },// CAN1_RX PA11 .pin_map =0,
.can_rcc = RCC_APB1Periph_CAN1,
.can_ch = CAN1,
.filter_start =0,//0~13
.irq = CAN1_RX0_IRQn,
.it_flag = CAN_IT_FMP0,
},
[CAN_DEV2]={
.can_dev_id = CAN_DEV2,
.fifo_no = CAN_Filter_FIFO1,
.t_pin ={ GPIO_Pin_13, RCC_APB2Periph_GPIOB, GPIOB },// CAN2_TX PB13 .r_pin ={ GPIO_Pin_12, RCC_APB2Periph_GPIOB, GPIOB },// CAN2_RX PB12 .pin_map =0,
.can_rcc = RCC_APB1Periph_CAN2,
.can_ch = CAN2,
.filter_start = CAN2_FILTER_S,//14~27
.irq = CAN2_RX1_IRQn,
.it_flag = CAN_IT_FMP1,
}
};
static can_tq_t *__get_tp(int br)
{
int i =0;
while(can_baud_array[i].can_baudrate !=0){
if(can_baud_array[i].can_baudrate == br){
return&can_baud_array[i];数字机顶盒
}
i++;
}
return NULL;
}
static void__can_enable(int can_dev, u32 val)
{最后的猎鹿者
if(can_dev == CAN_DEV1){
if(val == CAN_BUS_ENABLE){
_debug(SYS_INFO,"CAN_1 bus enable\n");
pp_ctrl_set(PIN_CAN1_STB,0);/*0 enable*/
}else{
pp_ctrl_set(PIN_CAN1_STB,1);/*1 disable*/
}
}else if(can_dev == CAN_DEV2){
if(val == CAN_BUS_ENABLE){
_debug(SYS_INFO,"CAN_2 bus enable\n");
pp_ctrl_set(PIN_CAN2_STB,0);/*0 enable*/
}else{
pp_ctrl_set(PIN_CAN2_STB,1);/*1 disable*/
}
}
}
int can_dev_init(int can_dev,int can_mode,int brp)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
can_cfg_t* pparam =&can_cfg[can_dev];
can_cfg_t* pparam =&can_cfg[can_dev];
_debug(SYS_INFO,"CAN%d Init start\n", pparam->can_dev_id +1);
CAN_DeInit(pparam->can_ch);
/* 使能GPIO、CANx外设复⽤功能时钟使能 */
RCC_APB1PeriphClockCmd(pparam->can_rcc, ENABLE);
RCC_APB2PeriphClockCmd(pparam->r_pin.gpio_rcc | pparam->t_pin.gpio_rcc, ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE);
/* GPIO 复⽤功能初始化:Rx */
GPIO_InitStructure.GPIO_Pin = pparam->r_pin.pin_bit;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(pparam->r_pin.gpio_port,&GPIO_InitStructure);
/* GPIO 复⽤功能初始化:Tx */
GPIO_InitStructure.GPIO_Pin = pparam->t_pin.pin_bit;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 复⽤推挽输出
GPIO_Init(pparam->t_pin.gpio_port,&GPIO_InitStructure);
/* CAN 初始化 */
u8 ret_can;
can_tq_t* pcan_baud =__get_tp(brp);
if(pcan_baud ==NULL){
_debug(SYS_INFO,"Setting BaudRate param is unqualified %d\n",brp);
return-1;
}
CAN_InitStructure.CAN_Prescaler = pcan_baud->can_prescaler;
CAN_InitStructure.CAN_SJW = pcan_baud->can_syn_jump_width;
CAN_InitStructure.CAN_BS1 = pcan_baud->can_time_bit_seg1;
CAN_InitStructure.CAN_BS2 = pcan_baud->can_time_bit_seg2;
_debug(SYS_INFO,"BaudRate = %dKHZ, can_prescaler = %d, CAN_SJW_%dtq, CAN_BS1_%dtq, CAN_BS2_%dtq \n",        pcan_baud->can_baudrate,
pcan_baud->can_prescaler,
pcan_baud->can_syn_jump_width +1,
pcan_baud->can_time_bit_seg1 +1,
pcan_baud->can_time_bit_seg2 +1);
CAN_InitStructure.CAN_Mode = can_mode;
CAN_InitStructure.CAN_TTCM = DISABLE;//can_time_trigger_communication;
CAN_InitStructure.CAN_ABOM = DISABLE;//can_auto_bus_off;
CAN_InitStructure.CAN_AWUM = DISABLE;//can_auto_wakeup;
CAN_InitStructure.CAN_NART = ENABLE;//can_no_auto_retransmit;(开启不⾃动重发)
CAN_InitStructure.CAN_RFLM = DISABLE;//can_recv_fifo_lock;
CAN_InitStructure.CAN_TXFP = DISABLE;//can_transmit_fifo_priority;
ret_can =CAN_Init(pparam->can_ch,&CAN_InitStructure);
if(ret_can ==0){
_debug(SYS_INFO,"CAN%d Initialize is failed \n", pparam->can_dev_id +1);
return-1;
}
#if 1
/* 接收中断参数配置 */
CAN_ITConfig(pparam->can_ch, pparam->it_flag, ENABLE);//FIFO0消息挂号中断允许
NVIC_InitStructure.NVIC_IRQChannel = pparam->irq;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;//⼦优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//接收IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//初始化接收中断配置
#endif
杨不管事件
_debug(SYS_INFO,"CAN%d Init end\n", pparam->can_dev_id +1);
return0;
}
int p_can_open(int can_dev,int bps)
int p_can_open(int can_dev,int bps)
{
int ret =can_dev_init(can_dev,CAN_Mode_Normal,bps);
if(ret ==0){
__can_enable(can_dev,CAN_BUS_ENABLE);
}
return ret;
}
void p_can_close(int can_dev)
{
NVIC_InitTypeDef NVIC_InitStructure ={0};
can_cfg_t* pparam =&can_cfg[can_dev];
__can_enable(can_dev,CAN_BUS_DISABLE);
CAN_ITConfig(pparam->can_ch, pparam->it_flag, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = pparam->irq;
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_DeInit(pparam->can_ch);
}
int p_can_read(int can_dev, can_msg_t* msg)
{
can_cfg_t* pparam =&can_cfg[can_dev];
CanRxMsg RxMessage;
/* 判别是哪个接收邮箱有数据挂起 */
if(CAN_MessagePending(pparam->can_ch, CAN_FIFO0)){
CAN_Receive(pparam->can_ch, CAN_FIFO0,&RxMessage);
}else if(CAN_MessagePending(pparam->can_ch, CAN_FIFO1)){
CAN_Receive(pparam->can_ch, CAN_FIFO1,&RxMessage);
}else{
_error("read error can msg");
return0;
}
if(CAN_Id_Standard == RxMessage.IDE){
msg->id_type = CAN_ID_ST;
msg->id = RxMessage.StdId;
阀体铸造_debug(SYS_INFO,"CAN%d FIFO0 receive msg Std_id = 0x%x ...\n", pparam->can_dev_id +1, RxMessage.StdId); }else{
msg->id_type = CAN_ID_EX;
msg->id = RxMessage.ExtId;
_debug(SYS_INFO,"CAN%d FIFO1 receive msg EXT_id = 0x%x ...\n", pparam->can_dev_id +1, RxMessage.ExtId); }
if(CAN_RTR_Data == RxMessage.RTR){
msg->id_frame = CAN_FR_DATA;
}else{
msg->id_frame = CAN_FR_REMOTE;
}
msg->len = RxMessage.DLC;
memcpy(msg->data,RxMessage.Data, RxMessage.DLC);
return RxMessage.DLC;
}
王驹
int p_can_send(int can_dev, can_msg_t* msg)
{
can_cfg_t* pparam =&can_cfg[can_dev];
CanTxMsg TxMsg ={0};
if(msg->id_type == CAN_ID_ST){
TxMsg.IDE = CAN_Id_Standard;
TxMsg.StdId = msg->id;
}else{
TxMsg.IDE = CAN_Id_Extended;
TxMsg.ExtId = msg->id;
TxMsg.ExtId = msg->id;
}
if(msg->id_frame == CAN_FR_DATA){
TxMsg.RTR =  CAN_RTR_Data;
}else{
TxMsg.RTR =  CAN_RTR_Remote;
}
TxMsg.DLC = msg->len;
memcpy(TxMsg.Data,msg->data,TxMsg.DLC);
pparam->txs.mbox_s = CAN_TxStatus_NoMailBox;
uint8_t tx_mbox =CAN_Transmit(pparam->can_ch,&TxMsg);
if(tx_mbox == CAN_TxStatus_NoMailBox){
_debug(SYS_INFO,"CAN Transmit Status is No MailBox\n");
return-1;
}
pparam->txs.mbox_s = tx_mbox;
return0;
}
int p_can_send_ok(int can_dev)
{
can_cfg_t* pparam =&can_cfg[can_dev];
if(pparam->txs.mbox_s == CAN_TxStatus_NoMailBox){
return-1;
}
if(CAN_TransmitStatus(pparam->can_ch, pparam->txs.mbox_s)== CAN_TxStatus_Failed){ return0;
}
return1;
}
#define CAN_ID_STD_STD CAN_ID_ST
#define CAN_ID_EXT_EXT CAN_ID_EX
#define CAN_ID_STD_EXT 2
#define CAN_ID_EXT_STD 3
static int__genc_ids(int format,uint32_t*ids,uint32_t*pout)
{
switch(format){
case CAN_ID_STD_STD:
pout[0]=(ids[0]<<21)| CAN_Id_Standard;
pout[1]=(ids[1]<<21)| CAN_Id_Standard;
break;
case CAN_ID_STD_EXT:
pout[0]=(ids[0]<<21)| CAN_Id_Standard;
pout[1]=(ids[1]<<3)| CAN_Id_Extended;
break;
case CAN_ID_EXT_STD:
pout[0]=(ids[0]<<3)| CAN_Id_Extended;
pout[1]=(ids[1]<<21)| CAN_Id_Standard;
break;
case CAN_ID_EXT_EXT:
pout[0]=(ids[0]<<3)| CAN_Id_Extended;
pout[1]=(ids[1]<<3)| CAN_Id_Extended;
break;
default:{
return-1;
}
}
return0;
}

本文发布于:2024-09-22 18:13:41,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/173595.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:接收   中断   使能   配置   入口   机顶盒   开启   阀体
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议