标题:
CAN通信CANBUSV1.3程序 CP2102芯片
[打印本页]
作者:
kaidilake
时间:
2017-4-26 08:51
标题:
CAN通信CANBUSV1.3程序 CP2102芯片
1.安装方法,CAN分析仪插入电脑,安装CP2102芯片的驱动程序。安装完毕打开AccessPort.exe串口调试助手,波特率设置为256000。接收区域设置为“字符显示”
注:发送指令最好使用快捷键F10 ,避免接收数据过程中,软件按钮不够灵敏。
2.关于CAN标识符 效验码和屏蔽码的关系举例如下:
例:
采集标识为066 067 068 069多标识500K速率的标准CAN数据
STD04 066 068 7FE 7FE
根据十六进制把标识分解二进制如下
8 4 2 1 8 4 2 1 8 4 2 1
0 0 0 0 0 1 1 0 0 1 1 0 ID:066
0 0 0 0 0 1 1 0 0 1 1 1 ID:067
0 0 0 0 0 1 1 0 1 0 0 0 ID:068
0 0 0 0 0 1 1 0 1 0 0 1 ID:069
发挥双滤波的作用,把上述ID分为两组。
第一组
0 0 0 0 0 1 1 0 0 1 1 0 ID:066
0 0 0 0 0 1 1 0 0 1 1 1 ID:067
第二组
0 0 0 0 0 1 1 0 1 0 0 0 ID:068
0 0 0 0 0 1 1 0 1 0 0 1 ID:069
第一组相同的位为
0 0 0 0 0 1 1 0 0 1 1 X ID:066
0 0 0 0 0 1 1 0 0 1 1 X ID:067
X先认为是0吧,即效验码为 066.
X屏蔽码中也认为是0,其它为1,所以屏蔽码为7FE
第二组相同的位为
0 0 0 0 0 1 1 0 1 0 0 X ID:068
0 0 0 0 0 1 1 0 1 0 0 X ID:069
X先认为是0吧,即效验码为 068
X屏蔽码中也认为是0,其它为1,所以屏蔽码为7FE
屏蔽码一个位是1的时候,是必须比较该位的意思,某些CAN控制器则相反,只是把7FE反过来001作为屏蔽码。可以认为 (线上的CAN ID & 屏蔽码(某些芯片屏蔽码要取反)) == 效验码 则该数据允许接收。
stm32单片机源程序:
#include "stm32f10x.h"
#include "includes.h"
#include "string.h"
u8 Check_Number(u8 checkdata);
u8 ASCII_4BIT(u8 data);
__IO u8 DisRAM[50];
__IO RAMVale SRAMCOUNT;
int main(void)
{
CanTxMsg TxMessage;
__IO CanRxMsg RxMessage;
uint8_t i,TransmitMailbox;
u16 ID1,ID2,MID1,MID2;
u32 id1,id2,mid1,mid2;
BSP_Init();
SRAMCOUNT.TURN = 0;
while(1)
{
if ((CotrolVale & 0x01) == 0x01)
{
printf("*****************************************你大爷*****************************************\n");
printf("网址:http://shop107599058.taobao.com \n");
printf("产品名:CAN分析仪 \n");
printf("使用说明: \n");
printf("1.标准CAN数据采集方法 \n");
printf(" CAN速率 效验位2 屏蔽位2 CAN速率: 2000000 / CAN速率 = xx \n");
printf(" ↓ ↓ ↓ \n");
printf(" 指令:STDxx XXX XXX XXX XXX \n");
printf(" ↑ ↑ \n");
printf(" 效验位1 屏蔽位1 \n");
printf(" 例1:采集所有线上500K速率的标准CAN数据 例2:采集标识为 066 125K速率的标准CAN数据 \n");
printf(" STD04 000 000 000 000 STD16 066 066 7FF 7FF \n");
printf(" 例3:采集标识为 066 067 33.3K速率的标准CAN数据 例4:采集标识为066 067 068 069多标识500K速率的标准CAN数据 \n");
printf(" STD60 066 067 7FF 7FF STD04 066 068 7FE 7FE(算法详见配套文档) \n");
printf("2.扩展CAN数据采集方法 \n");
printf(" CAN速率 效验位2 屏蔽位2 CAN速率: 2000000 / CAN速率 = xx \n");
printf(" ↓ ↓ ↓ \n");
printf(" 指令:EXTxx XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX \n");
printf(" ↑ ↑ \n");
printf(" 效验位1 屏蔽位1 \n");
printf(" 例1:采集所有线上500K速率的扩展CAN数据 例2:采集标识为 193F1343 125K速率的扩展CAN数据 \n");
printf(" EXT04 00000000 00000000 00000000 00000000 EXT16 193F1343 193F1343 1FFFFFFF 1FFFFFFF \n");
printf(" 例3:采集标识为 193F1343 16EBF836 33.3K速率的扩展CAN数据 \n");
printf(" EXT60 193F1343 16EBF836 1FFFFFFF 1FFFFFFF \n");
printf(" 例4:采集标识为 16EBF835 16EBF836 16EBF837 16EBF838 等多标识500K速率的扩展CAN数据 \n");
printf(" EXT04 16EBF830 16EBF830 1FFFFFF0 1FFFFFF0 (算法详见配套文档) \n");
printf("3.CAN数据发送 \n");
printf(" 标准与扩展 数据长度 CAN速率: 2000000 / CAN速率 = xx \n");
printf(" ↓ ↓ \n");
printf(" 指令: SENDSTD(EXT)xx X XXXXXXXX XXX XXX XXX XXX XXX XXX XXX XXX XXX \n");
printf(" ↑ ↑ \n");
printf(" CAN速率 发送的数据帧 \n");
printf(" 例1:发送500K标准CAN数据 \n");
printf(" SENDSTD04 8 066 01 02 03 04 05 06 07 08 \n");
printf(" 例2:发送125K扩展CAN数据 \n");
printf(" SENDEXT16 3 193F1343 01 02 03 \n");
printf("4.单线CAN数据采集:请将CAN高连接单线数据线,CAN低连接接地端. \n");
CotrolVale = 0;
}
else if ((CotrolVale & 0x02) == 0x02)
{
CAN_Cofig(Check_Number(Cmd[7])*10 + Check_Number(Cmd[8]));
if (!strncmp((const char *)Cmd+4,"STD",3))
{
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = Check_Number(Cmd[10]);
TxMessage.StdId = (u32)Check_Number(Cmd[12])<<8;
TxMessage.StdId |= (u32)Check_Number(Cmd[13])<<4;
TxMessage.StdId |= (u32)Check_Number(Cmd[14]);
for(i = 0;i < TxMessage.DLC;i++)
{
TxMessage.Data[i] = (u8)Check_Number(Cmd[16+3*i])<<4;
TxMessage.Data[i] |= (u8)Check_Number(Cmd[17+3*i]);
}
if ((CotrolVale & 0x80) != 0x80)
{
TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
while (CAN_TransmitStatus(CAN1,TransmitMailbox) != 1);
printf("标准CAN数据已发送...\n");
CotrolVale = 0;
}
}
else if (!strncmp((const char *)Cmd+4,"EXT",3))
{
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_EXT;
TxMessage.DLC = Check_Number(Cmd[10]);
TxMessage.ExtId = 0;
for (i = 0; i < 8; i++)
{
TxMessage.ExtId |= (u32)Check_Number(Cmd[12+i])<<4*(7-i);
}
for(i = 0;i < TxMessage.DLC;i++)
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整代码:
CANBUSV1.3程序.rar
(1.56 MB, 下载次数: 32)
2017-4-26 08:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
dqjiang
时间:
2017-9-23 12:18
好东西呀,可以不用买开发板了
作者:
dqjiang
时间:
2017-9-23 13:38
这个东西很好,希望更详细点
作者:
askloser
时间:
2019-1-11 11:03
先感謝分享 , 不知是 完全自己寫 , 還是運用 ST裡 的庫
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1