用原子哥的板子,外接一个TJA1050的CAN收发芯片,但是遇到一些问题。这个消息有时候发送不出去(开始的时候基本发不出去),然后卡了很久,突然会在某一刻发出去了,之后就持续发了,哪位大虾指点一下!
#define CAN_Recv GPIO_Pin_11
#define CAN_Send GPIO_Pin_12
#define CAN_PORT GPIOA
(1)基本配置都差不多:
void CAN_Normal_Config()
{
//根据 CAN_InitStruct 中指定的参数初始化外设 CAN 的寄存器
CAN_FilterInitTypeDef CAN_FilterInitStructure; //变量申明不允许出现在语句之后,不然会出现error: #268:declaration may not appear after executable statement in block 错误提示
/* CAN cell init */
CAN_InitTypeDef CAN_InitStructure;
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM = DISABLE; //使能或者失能时间触发通讯模式
CAN_InitStructure.CAN_ABOM = DISABLE; //使能或者失能自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //使能或者失能自动唤醒模式
CAN_InitStructure.CAN_NART = DISABLE; //使能或者失能非自动重传输模式
CAN_InitStructure.CAN_RFLM = DISABLE; //使能或者失能接收 FIFO 锁定模式
CAN_InitStructure.CAN_TXFP = DISABLE; //使能或者失能发送 FIFO 优先级
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //硬件工作在正常模式
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //0x02 重新同步跳跃宽度 3 个时间单位
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段 1 的时间单位数目 (时间段1(BS1):定义采样点的位置。)
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler = 5; // 波特率分频器 该位域定义了时间单元(tq)的时间长度 即BRP[9:0]
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 0; //待初始化的过滤器,它的范围是 1 到 13
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //指定过滤器被设置为标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)0x1f<<21)&0xffff0000)>>16; //设定过滤器标识符
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)0x1f<<21)|CAN_ID_STD)&0xffff; //
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; //设定过滤器屏蔽标识符或者过滤器标识符
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; //
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0; //过滤器 FIFO0 指向过滤器0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);// FIFO0 消息挂号中断屏蔽 使能
}
(2)/*******************************************************
函数功能:CAN发送数据
*******************************************************/
int CAN_SendMessage(char* Message)
{
CanTxMsg TxMessage;
uint32_t i;
uint8_t TransmitMailbox = 0;
/* CAN cell init */
CAN_InitTypeDef CAN_InitStructure;
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM = DISABLE; //使能或者失能时间触发通讯模式
CAN_InitStructure.CAN_ABOM = DISABLE; //使能或者失能自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //使能或者失能自动唤醒模式
CAN_InitStructure.CAN_NART = DISABLE; //使能或者失能非自动重传输模式
CAN_InitStructure.CAN_RFLM = DISABLE; //使能或者失能接收 FIFO 锁定模式
CAN_InitStructure.CAN_TXFP = DISABLE; //使能或者失能发送 FIFO 优先级
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //硬件工作在正常模式
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //0x02 重新同步跳跃宽度 3 个时间单位
CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段 1 的时间单位数目 (时间段1(BS1):定义采样点的位置。)
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler = 5; // 波特率分频器 该位域定义了时间单元(tq)的时间长度 即BRP[9:0]
CAN_Init(CAN1, &CAN_InitStructure);
//CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);// FIFO0 消息挂号中断屏蔽
TxMessage.StdId = 0x1F; //设定标准标识符
TxMessage.ExtId = 0x00; //设定扩展标识符
TxMessage.IDE = CAN_ID_STD; //设定消息标识符的类型为用标准标识符
TxMessage.RTR = CAN_RTR_DATA; //设定待传输消息的帧类型为数据帧
TxMessage.DLC = 2; //设定待传输消息的帧长度
TxMessage.Data[0] = 0xAA;
TxMessage.Data[1] = 0x55;
CAN_Transmit(CAN1, &TxMessage);
TransmitMailbox = CAN_Transmit(CAN1,&TxMessage); //开始一个消息的传输
i = 0;
while( CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK && i < 0xFFFFF) //CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK
{
++i;
}
//CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE); // Disable interrupt handling
if(i==0xfffff)//发送超时,但发送不成功
{
return 1;
}
return 0;
}
(3)main
if(CAN_SendMessage(NULL)== 0)
{
GPIO_ResetBits(GPIOD , GPIO_Pin_2);
Delay(0xfffff);
Delay(0x4ffff);
Delay(0xfffff);
Delay(0x4ffff);
GPIO_SetBits(GPIOD , GPIO_Pin_2);
Delay(0xfffff);
Delay(0x4ffff);
Delay(0xfffff);
Delay(0x4ffff);
}
开始的现象是这个灯一直都不闪,我发送超时的时间已经设得很长了,但是它还是没反应,这可能是什么原因呢。
我用环回模式是正常的,但是用正常模式却一直有问题。 我也不知道是什么原因。
还有一个问题就是,TJA1050是5V供电的,直接把接收和发送引脚接到32的引脚上会不会不好。
|