新手入门
- 积分
- 0
- 金钱
- 0
- 注册时间
- 2022-1-8
- 在线时间
- 6 小时
|
6金钱
本帖最后由 GeorgeZZQ 于 2022-3-8 10:06 编辑
问题描述:
只测GPIO_Pin_12 & GPIO_Pin_11(CAN_TX和CAN_RX引脚),示波器有波形;如果测经过TJA1050转换后的CAN_H和CAH_L示波器无波形,并且PC上的接收软件也无CAN帧到达
但我肯定物理层是没有错误的,TJA1050 5V供电和GND是在STLink USB接口那里引出来的;且TSJW=1,TBS1=9,TBS2=8,CAN_Prescaler=4,波特率被严格配置成500KHz
代码主要是在配置数据链路层,感觉TxMessage中能填的都填完整了(帧ID,数据区,IDE,RTR,DLC......)
==================================main函数外======================================
/*bxCAN控制器设置,GPIO端口设置(无引脚重映射,使用默认复用功能:GPIOA_Pin_11作为CAN_RX,GPIOA_Pin_12作为CAN_TX*/
void CAN1_Init(uint8_t tsjw,uint8_t tbs1,uint8_t tbs2,uint16_t brp,uint8_t mode)
{
//1.RCC开启bxCAN时钟,GPIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2.配置GPIOA
//CAN_RX引脚GPIOA_Pin_11使用上拉输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//CAN_TX引脚GPIOA_Pin_12使用复用推挽输出,∵使用了默认复用功能
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//3.配置CAN控制器工作模式,波特率等
CAN_InitTypeDef CAN_InitStructure;
CAN_InitStructure.CAN_SJW=tsjw;
CAN_InitStructure.CAN_BS1=tbs1;
CAN_InitStructure.CAN_BS2=tbs2;
CAN_InitStructure.CAN_Prescaler=brp;
CAN_InitStructure.CAN_Mode=mode;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=ENABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_Init(CAN1,&CAN_InitStructure);
}
/*往CAN总线发送一帧数据*/
uint8_t CAN_Send_Msg(uint8_t *msg,uint8_t len)
{
uint8_t mbox; //使用的发送邮箱号
uint16_t i;
CanTxMsg TxMessage; //要发送的消息的结构体
TxMessage.StdId=0x12; //标准标识符
TxMessage.ExtId=0x12; //拓展标识符
TxMessage.IDE=CAN_Id_Standard; //标准帧
TxMessage.RTR=CAN_RTR_Data; //数据帧
TxMessage.DLC=len; //要发送的数据长度
for(i=0;i<len;i++) //逐个字节复制数据
{
TxMessage.Data=函数内msg;
}
mbox=CAN_Transmit(CAN1,&TxMessage);//返回所使用的发送邮箱号,一个邮箱存一个报文
i=0;
while((CAN_TransmitStatus(CAN1,mbox)==CAN_TxStatus_Failed)&&(i<0xFFF))
{
i++;
}
if(i>0xFFF)
{
return 1; //发送失败
}
return 0; //发送成功
}
====================================main函数内=========================================
CAN1_Init(CAN_SJW_1tq,CAN_BS1_9tq,CAN_BS2_8tq,4,CAN_Mode_Normal);
while(1)
{
res=CAN_Send_Msg(canbuf,8);
if(!res)
{
for(i=0;i<8;i++)
{
OLED_ShowNum(2,i+1,canbuf,1);
}
}
Delay_ms(1000);
}
|
-
硬件连接图
-
PC中的USB-CAN Tool软件不能接受到CAN帧
|