新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2017-6-13
- 在线时间
- 5 小时
|
1金钱
如题,想买块原子的板子,但是看淘宝上并没有介绍有没有can收发器?所以想问问,或者有can收发器模块怎么连接?
另外目前手里有块32f103的板子,上面有tj1050can收发器,环回模式自测成功,但是连接到汽车obd上无法接受数据,CAN_MessagePending(CAN1,CAN_FIFO0);调试这个函数返回值始终为0,(自测时,发送后为1,可以接受发送的数据)硬件连接时找到obd的高速can_h,can_l,连接到单片机上对应的can_h,can_l(是不是连接有什么问题?刚涉足单片机方面不是很懂)
另外代码如下,(是不是代码的问题)
can.c
void CAN_GPIO_Configuration (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
//CANTX配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CANRX配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CAN总线初始化 波特率=APB1总线时钟 36M/4/(8+9+1)=500K
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 = ENABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
//CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 4;
CAN_Init(CAN1,&CAN_InitStructure);
//CAN过滤器初始化
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
//发送函数
u8 CAN_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId = 0xFF;
TxMessage.ExtId = 0xFF;
TxMessage.IDE = 0;//CAN_ID_STD;
TxMessage.RTR = 0;//CAN_RTR_DATA;
TxMessage.DLC = len;
for(i=0;i<len;i++)
TxMessage.Data[i] = msg[i];
mbox = CAN_Transmit(CAN1,&TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1,mbox) != CANTXOK) && (i < 0xFF))//等待发送成功
{
i++;
}
if(i>=0xFF) return 1;
return 0;
}
//接受函数
u8 CAN_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if(CAN_MessagePending(CAN1,CAN_FIFO0)==0) return 0;
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
for (i=0;i<8;i++)
buf[i] = RxMessage.Data[i];
return RxMessage.DLC;
}
//主函数中实现接受的主要逻辑代码
main.c
CAN_GPIO_Configuration();
LCD_Init();
LCD_Clear(WHITE);
LCD_ShowString(30,40,"CAN PROGRAM RUNNING",POINT_COLOR);
//CAN_Send_Msg(canbuf,8);
message = CAN_MessagePending(CAN1,CAN_FIFO0);
while(message>0)
{
key = CAN_Receive_Msg(rxbuf);
if(key)
LCD_ShowString(30,60,"RECEIVE_OK",POINT_COLOR);
else
LCD_ShowString(30,60,"FALSE",POINT_COLOR);
LCD_ShowString(30,120,rxbuf,POINT_COLOR);//显示到LCD屏幕上
message = CAN_MessagePending(CAN1,CAN_FIFO0);
}
请教下问题是出在哪里?该怎么调试或者用什么方法来检测呢?
|
|