PIC16F877A单片机自带有8路模拟通道,转换精度为10位。本适配卡选择RA0为模拟通道。板卡将A/D转换后的数据通过CAN总线上传给上位机。
CAN-RS-232的数据流图见图4。
软件设计分为两大块:板卡底层软件设计和PC机上串口操作软件设计。板卡底层软件设计主要是对PIC16F877A编程,用于把从PC机通过串口输人给单片机的数据按照CAN协议帧结构进行打包处理,并操作CAN控制器把数据发送到CAN总线;把从CAN总线上输入的数据转换成串行数据输出给PC机:PC机上串口操作软件设计主要是对串口的操作和通过串口收发数据。
开发工具使用的是MPLAB集成开发环境(IDE),它是综合的编辑器、项目管理器和设计平台,适用于使用Microchip的PICmicro系列单片机进行嵌入式设计的应用开发;编程语言用的是C语言,将HITECH 公司的PICC编译器直接挂接在MPLAB-IDE集成开发平台下,实现一体化的编译连接和原代码调试。
CAN控制器SJA1000T片内有模式寄存器MOD、命令寄存器CMR、状态寄存器SR、中断寄存器IR、中断使能寄存器IER、接收缓冲器RXB、发送缓冲器TXB、仲裁丢失捕捉寄存器ALC、错误代码捕捉寄存器ECC、错误报警限额寄存器EWLR、错误计数寄存器ERR、验收代码寄存器ACR、验收屏蔽寄存器AMR、总线时序寄存器BTR、输出控制寄存器OCR和时钟分频寄存器CDR等,单片机就是通过读写这些寄存器来实现对SJA1000T的控制,从而实现CAN报文的接收和发送。文后给出CAN控制器SJA1000T初始化和接收子程序的流程图。下面给出CAN初始化程序,其中WRCAN是自定义的一段对SJAIO00T写数据的子程序。
void CANINI()
{
WRCAN(MODE,0x09); //进入复位模式,选择单向滤波方式,对SJA1000T进行初始化
WRCAN(CDR,0x88); //选择PeliCAN模式,关闭CLKOUT
WRCAN(IER,0x0D); //中断允许寄存器
//以下根据需要对屏蔽寄存器赋初值,将位设为1表示DON'T CARE,设为0表示CARE
WRCAN(AMR0,0x00);
WRCAN(AMR1,0x00);
WRCAN(AMR2,0xFF);
WRCAN(AMR3.0xFF); //因为AMR3的最低两位是不用的,必须置“1”
//以下根据情况为验收代码寄存器赋初值
WRCAN(ACR0,0x00);
WRCAN(ACR1,0x00);
WRCAN(ACR2,0xFF);
WRCAN(ACR3,0xFF); //ACR,AMR各位设为1,是为了允许任何数据通过滤波器的验收
WRCAN(BTR0,0x03); //总线定时寄存器
WRCAN(BTR1,0xFF); //设置波特率为50kbps
B=fXT/[2*BRP*(1+Tseg1+Tseg2)]
WRCAN(OCR,0xAA); //输出控制寄存器
WRCAN(RBSA,0x00); //接收缓存寄存器FIFO的起始地址为0
WRCAN(TXERR,0x00); //清除发送错误寄存器
RDCAN(ECC); //清除ECC,因为ECC是只读不能写的,当被读出时,其相应位即被清除
WRCAN(MODE,0x08); //设为单滤波方式,并返回工作状态
return;
}
void WRCAN(address,data) //向SJA1000T的寄存器写入数据
unsigned char address;
unsigned char data;
{
PORTC=0x0D; //RC3=1;RC2=1;Rc1=0;RC0=1;即ALE置1,则锁存地址,其余端口参考时序图
PORTD=address;
PORTC=0x04; //RC0=0;RC1=0;RC2=1;RC3=0;即ALE置0,则传输据.进入写方式,其余端口参考时序图
PORTD=data; //将数据写入端口D
PORTC=0x0E; //RC3=1;RC2=1;RC1=1;RC0=0;各端口还原
}