本人某高校研究生,刚刚研一,接触了一些小项目,想单纯记录一下项目进度以及成果。水平不足,仅供参考,希望能够对大家有所帮助。
板卡介绍:板卡上共4片SJA1000-T芯片,具体芯片功能不进行赘述了,布线方面,四片SJA1000的AD0~AD7拉成了一套数据地址总线,RD#、WR#、RST均是总线形式,ALE、INT#、CS#则是每片使用。
以下是SJA1000的具体原理图,采用了两片晶振分别为16MHZ和12MHZ,通过拨码开关进行选择。
接下来进行SJA1000初始化的具体操作:
Vivado部分:
首先,在Vivado中加入system.bd以及AXI GPIO IP核,此程序选择dual channel 模式:
Auto Connect以后生成以下design。其中GPIO_0是所有的控制引脚,GPIO2_0则为AD0~AD7(需要注意的是,这里的信号反向全部使用IO,在SDK中我们可以通过XGpio_SetDirection函数进行输入输出方向的设置,其内部原理就是控制IOBUF中的IO_t引脚高低电平)
之后Create HDL——Genrate Output——xdc管脚约束——generate bitstream——export hardware——launch sdk
SDK部分:
1.首先我们要根据Datasheet中给出的寄存器偏移地址写出SJA1000.h文件方便之后寄存器调用
#ifndef __SJA1000_H__
#define __SJA1000_H__
#include "string.h"
#define SJA_BaseAdr 0X00
#define REG_CONTROL SJA_BaseAdr+0x00 //内部控制寄存器
#define REG_COMMAND SJA_BaseAdr+0x01 //命令寄存器 只写
#define REG_STATUS SJA_BaseAdr+0x02 //状态寄存器 只读
#define REG_INTERRUPT SJA_BaseAdr+0x03 //中断寄存器 只读
#define REG_INTENABLE SJA_BaseAdr+0x04 //中断使能寄存器 可读可写
#define REG_RESVER0 SJA_BaseAdr+0x05 //保留0
#define REG_BTR0 SJA_BaseAdr+0x06 //总线定时寄存器0 复位模式读写
//定义了波特率预设值BRP 和同步跳转宽度SJW 的值
#define REG_BTR1 SJA_BaseAdr+0x07 //总线定时寄存器1 复位模式读写
//总线定时寄存器1 定义了每个位周期的长度采样点的位置和在每个采样点的采样数目
#define REG_OCR SJA_BaseAdr+0x08 //输出控制寄存器 复位模式读写
//输出控制寄存器实现了由软件控制不同输出驱动配置的建立
#define REG_TEST SJA_BaseAdr+0x09 //测试寄存器
#define REG_RESVER1 SJA_BaseAdr+0x0A //保留1
#define REG_ARBITRATE SJA_BaseAdr+0x0B //仲裁丢失捕捉 只读
#define REG_ERRCATCH SJA_BaseAdr+0x0C //错误代码捕捉 只读
#define REG_ERRLIMIT SJA_BaseAdr+0x0D //错误报警限额 工作模式只读 复位模式可读写
#define REG_RXERR SJA_BaseAdr+0x0E //接收错误计数器工作模式只读 复位模式可读写
#define REG_TXERR SJA_BaseAdr+0x0F //发送错误计数器工作模式只读 复位模式可读写
#define REG_ACR0 SJA_BaseAdr+0x10 //验收代码寄存器
#define REG_ACR1 SJA_BaseAdr+0x11 //验收代码寄存器
#define REG_ACR2 SJA_BaseAdr+0x12 //验收代码寄存器
#define REG_ACR3 SJA_BaseAdr+0x13 //验收代码寄存器
#define REG_AMR0 SJA_BaseAdr+0x14 //验收屏蔽寄存器
#define REG_AMR1 SJA_BaseAdr+0x15 //验收屏蔽寄存器
#define REG_AMR2 SJA_BaseAdr+0x16 //验收屏蔽寄存器
#define REG_AMR3 SJA_BaseAdr+0x17 //验收屏蔽寄存器
// 发送缓冲区寄存器 (发送缓冲区长13字节,在CAN地址是16-28即0x10-0x1c)
#define REG_TXBuffer1 SJA_BaseAdr+0x10 //发送缓冲区1
#define REG_TXBuffer2 SJA_BaseAdr+0x11 //发送缓冲区2
#define REG_TXBuffer3 SJA_BaseAdr+0x12 //发送缓冲区3
#define REG_TXBuffer4 SJA_BaseAdr+0x13 //发送缓冲区4
#define REG_TXBuffer5 SJA_BaseAdr+0x14 //发送缓冲区5
#define REG_TXBuffer6 SJA_BaseAdr+0x15 //发送缓冲区6
#define REG_TXBuffer7 SJA_BaseAdr+0x16 //发送缓冲区7
#define REG_TXBuffer8 SJA_BaseAdr+0x17 //发送缓冲区8
#define REG_TXBuffer9 SJA_BaseAdr+0x18 //发送缓冲区9
#define REG_TXBuffer10 SJA_BaseAdr+0x19 //发送缓冲区10
#define REG_TXBuffer11 SJA_BaseAdr+0x1A //发送缓冲区11
#define REG_TXBuffer12 SJA_BaseAdr+0x1B //发送缓冲区12
#define REG_TXBuffer13 SJA_BaseAdr+0x1C //发送缓冲区13
// 接收缓冲区寄存器 (接收缓冲区长13字节,在CAN地址是16-28即0x10-0x1c)
#define REG_RXBuffer1 SJA_BaseAdr+0x10 //接收缓冲区1
#define REG_RXBuffer2 SJA_BaseAdr+0x11 //接收缓冲区2
#define REG_RXBuffer3 SJA_BaseAdr+0x12 //接收缓冲区3
#define REG_RXBuffer4 SJA_BaseAdr+0x13 //接收缓冲区4