SFR:MCP2517FD Special Function Registers
MCP2517FD 有如下模式:
- Configuration
- Normal CAN FD
- Normal CAN 2.0
- Sleep
- Listen Only
- Restricted Operation
- Internal and External Loop back modes
BSP(CAN FD Bit Stream Processor)用来编解码CANFD报文,进行应答,检测错误信号。
发送报文使用发送FIFO请求来发送,使用RAM接口来从RAM中取得要发送的数据提供给BSP来发送。
接收报文通过验收滤波器来过滤哪些报文被存储到接收FIFO中,同样使用RAM接口来保存数据到RAM。
每个FIFO可以被配置为发送或接收FIFO。通过FIFO Control来跟踪FIFO的头和尾,计算用户地址。对于TX FIFO,用户地址所指向的RAM地址是下一个要被发送数据帧的存储地址。即将要发送的数据写到此地址处再启动发送。对于RX FIFO来说,用户地址所指向的是下一个应该被读的数据所在RAM中的地址。用户通过增加FIFO的Head/Tail来通知FIFO一个报文已经写入到RAM或从RAM中读取完成。
TXQ(Transmit Queue)是一个特别的发送FIFO,它发送报文基于被存到队列的报文的ID。
如图是主要的内存分配和地址范围,每个SFR都是32bit,例如CiCOM的最低位地址是0x000,最高位地址是0x003.
SPI接口
mcp2517fd 使用SPI接口来和微控制器进行通信,使用模式1,1或0,0的8-bit模式来进行通信。SFR和RAM的访问通过SPI命令来进行。每个命令在nCS下降沿后的SCK上升沿开始,一帧由4-bits command和12-bits address再加上数据组成。在nCS拉高时结束。
模式的操作
“Normal” Modes:Normal FD Mode 、Normal2.0 mode
“Debug” Modes:External/Internal Loopback Mode、Listen Only Mode、Restricted Operation Mode
如上图所示是模式的转换,新的模式通过写CiCON.REQOP来请求模式改变。只能在总线空闲时改变模式。通过读取CiCON.OPMOD可知当前处于什么模式。
直接在“Normal” Modes之间转换是不允许的,要转换到新模式必须先转换到配置模式。
直接在“Debug” Modes之间转换也是不允许的,要转换到新模式必须先转换到配置模式。
Configuration Mode
复位后,2517FD处于配置模式,错误计数会清零所有寄存器恢复默认值。
激活前必须先初始化CAN FD控制器模块。只有在模块处于配置模式,OPMOD = 100时才可以进行初始化。通过将REQOP = 100来请求配置模式。
Normal Modes
1.Normal CANFD mode
通过设置REQOP=000来请求此模式,在此模式设备可以传送CANFD帧和普通CAN帧。
2.Normal CAN2.0 mode
通过设置REQOP=110来请求此模式,此模式下只能接收CAN帧不能接收CANFD帧。
Sleep Mode
通过设置REQOP = 001来请求睡眠模式。
配置模块
1. 首先要复位MCP2517FD,在配置前让模块处于配置模式。对晶振、FIFO和位时间的设置只能在配置模式下;
2. 配置晶振和CLKO引脚;
3. 配置I/O引脚;
4. 配置CAN控制寄存器;
5. 配置波特率相关寄存器;
6. 配置TEF, TXQ,TX和RX FIFO
报文发送
报文格式如上所示
1. 将要发送的报文写入发送FIFO
在将待发送报文写入FIFO前必须保证FIFO没有满。如果CiFIFOSTAm.TFNRFNIF为1,则FIFO中有空间。通过读取CiFIFOUAm(m=0~31)得到FIFO用户地址。FIFO用户地址指向指向下一个待发送报文存储在RAM中的地址。用户要将报文数据写到此地址。在RAM中的实际地址是 A = 0x400 + CiFIFOUAm。
当报文写入FIFO后需要设置CiFIFOCONm.UINC来使CANFD控制器增加FIFO的Head和更新CiFIFOUAm,指向写一个待存储发送报文的地址。此时这个写入的报文可以准备好发送,下一个报文也可以写入下一个FIFO地址。
2. 请求发送FIFO的报文
在上一步将报文写入发送FIFO后,这些报文只是准备好发送,但还没触发发送。应用通过设置CiFIFOCONm.TXREQ 或设置CiTXREQ寄存器的对应位来触发CANFD控制器将FIFO内所有报文发送出去。当所有报文被发送完后会自动清除TXREQ位。在发送期间可以继续将报文写入发送FIFO,但写入后必须置位UINC和TXREQ,确保新加入的报文也被发送出去。