16.2.2 操作有两个 CAN 接口寄存器组(CANIF1x 和 CANIF2x) ,用于访问报文存储器中的报文对象CAN 控制器犹如一个将发送到报文存储器或从报文存储器发送的行为转换成发送到寄存器和从寄存器中发送的转换器这两组寄存器是相互独立的,同时又具有相同的配置也可以用于排队处理通常,一个接口用于发送数据另一个一个接口用于接收数据一旦 CAN 模块被初始化,并且寄存器 CANCTL 中的 INIT 位将被清零,CAN 模块将同步与 CAN 总线,并启动报文发送每一个报文的接受都将进行报文处理器的滤波处理,如果报文通过了滤波处理,报文被存储在由 CANIFn(CANIFnCRQ)控制请求寄存器中的 MNUM 比特位指定的报文对象中整个报文(包括所有的仲裁比特位,数据长度码,和8个数据字节)存储在报文对象中如果使用了标识符屏蔽(在 CANIFn屏蔽1和CANIFn屏蔽2(CANIF nMSK n)中的 MSK 比特位) ,那么被屏蔽位“无关”的总裁比特位将在报文对象中被覆盖CPU 可以在任何时候通过 CAN 接口寄存器对每个报文进行读和写报文处理器确保了在同时访问的情况下数据的一致性。
报文对象是在管理 CAN 硬件的软件控制下进行发送的,这些可以是用于一次性的数据传输报文对象,也是用于周期性响应的报文对象永久性报文设置了所有的总裁和控制并且只能更新数据在启动传输时,相应的 CAN 传输请求寄存器(CANTXRQn)中的TXPQST 和 CAN 新数据寄存器 (CANNWDAn)被置位如果多个发送报文被分配个同一个报文对象(在报文对象不够时) ,整个报文对象必须在报文被请求发送前配置同一时刻可以请求发送任意数目的报文对象;他们是根据基于报文对象的报文标识符(MNUM)的内部有限级发送的报文标识符 1 是最高的, 32 是最低的报文可以在任意时刻更新或设置成无效即使是在报文的请求发送仍被挂起的时候报文在挂起发送之前被更新的话,将丢弃旧数据当接受到一个匹配标识符的远程帧时,将根据报文对象的配置自动的进行报文传输请求当接受到一个匹配的远程帧时报文传输将自动启动为使能这模式,须置位 CANIFn报文控制寄存器(CANIFnMCTL) 一个匹配的远程帧的接受将导致 TXRQST 比特位的置位相应的报文对象将自动地发送它的的数据或产生一个指示远程帧被请求的中断CAN屏蔽寄存器 CANIFnMSKn,配置哪些帧组被标识为远程帧所请求的。
在 CANIFnMCTL 寄存器中的 UMASK 比特位使能 CANIFnMSKn 寄存器中的 MSK 比特来对被标识为远程帧请求的帧进行滤波处理如果一个远程帧请求被希望与由 29 位扩展标识符触发将置位CANIFnMSK2 寄存器中的 MXTD 比特16.2.3 发送报文对象CAN 模块的内部移位寄存器准备装载,并且如果在 CAN 接口寄存器和报文存储器之间没有数据传输,被挂起中断请求的最高级有效报文对象将被报文处理器装载到发送移位寄存器中,同时报文传输开始寄存器 CANNWDAn 中的 NEWDAT 比特位将被清零自从上次报文发送启动后如果没有新的数据写入报文对象,寄存器 CANTXRQn 中的TXRQST 比特位将被清零,如果 CAN 控制器被配置成一旦一个报文对象发送成功后就中断, (寄存器 CANIFn 报文控制寄存器的 TXIE 位被置位)那么寄存器 CANIFnMCTL 中的INTPND 位将在成功发送后置位如果 CAN 模块丢失了仲裁或者在发送时发生错误,则一旦 CAN 总线再次空闲的时候,报文将再次发送如果同时有较高优先级的报文发送被请求,报文将会依据优先级进行发送16.24 配置一个发送报文对象一下的步骤将说明如何配置一个发送报文对象1.在 CANIFn 命令屏蔽寄存器(CANIFnCMSK)中的配置 设置 WRNRD 比特位来指定一次对 CANIFnCMAK 寄存器的写操作;指定是否将报文 对象的 IDMASK,DIR,MXTD 传输到用于 MASK 比特的 CANIFn 寄存器中 指定是否将报文对象的 ID,DIR ,XTD,和 MSGVAL 传输到用于 ARB 位的接口寄存器中。
指定是否将控制比特位传输到用于 CONTROL 比特的接口寄存器中 指定是否清除用于 CLRINTPND 位的 CANIFnMCTL 寄存器中的 INTPND 位 指定是否清除用于 NEWDAT 位的 CANNWDAn 寄存器的 NEWDAT 位 指定传输哪些比特位用于 DATAA 和 DATAB 比特2 在寄存器 CANIFnMSK1 用 MSK[15:0]比特位来指定在 29 位标识符或 11 位标识符中哪些位用作接受滤波注意在这个寄存器中的 MSK[15:0]位用于 29 位标识符中的比特[15:0]而不用于一个 11 位的标识符报文0X00 这个值使能所有的报文通过接受滤波也应当注意为了让这些比特位用作=于接受滤波,他们必须通过置位寄存器 CANIFnMCTL 中的UMASK 位来使能3.在寄存器 CANIFnMSK2 中,用 MSK[12:0]比特位来指定在 29 位标识符或 11 位标识符中的哪些位用作报文接受滤波注意 MAK[12:0]被用于 29 位报文标识符的位[28:16];而MSK[12:2]用于 11 位报文标识符的位[10:0] 用 MSTD 和 MDIR 位来指定是否将 XTD 和DIR 用于接受滤波。
0X00 这个值将使能所有的报文通过报文接受滤波同时也要注意为了将这些比特用于报文接受滤波,他们必须置位寄存器 CANIFnMCTL 中的 UMASK 位来使能4.对于一个 29 位的报文标识符,配置用于报文标识符的[15:0]位寄存器 CANIFnARB1 中的ID[15:0]和用于报文标识符位[28:16] 的寄存器 CANIFnARB2;置位 DIR 位来表示发送,置位 MSGVAL 比特位来表示报文对象有效5.对于 11 位的报文标识符,没有用 CANIFnAARB1 寄存器寄存器 CANIFnARB2 中的ID[12:2]用于比特报文标识符的位[10:0] ,清除 XTD 比特位上来说明一个标准标识符;置位DIR 比特位来表示发送;置位 MSGVAL 比特位来表示报文对象有效6.在寄存器 CANIFnMCTL 中的配置 可选择性的将 UMASK 比特位置位来使能接受滤波屏蔽(寄存器 CANIFnMSK1和 CANIFnMSK2 中指定的 MSK,MXTD 位) 可以地置位 TXIE 位使能接受成功后置位 INTPND 位 可选择地置位 RMTEN 位来使能置位 TXRQST 位来达到接受到一个匹配的远程帧后自动发送 对于单个报文对象置位 EOB 位 设置 DLC 域来指定数据帧的长度。
注意在配置过程中不能设置NEWDAT,MSGLST,INTPND,或者 TXRQST 位7.装载发送到 CANIFnData 寄存器(CANIFnDA1 ,CANIFnDA2,CANIFnDB1,CANIFnDB2)或者(CANFInDATAA 和CANFInDATAB)的数据,CAN 数据帧的字节 0 存储在 CANIFnDA1 寄存器中的DATA[7:0]8.在 CANIFn 命令请求寄存器(CANIFnCRQ)中的 MNUM 域对发送报文对象的数目进行编程9.当各个寄存器都正确配置后,置位在寄存器 CANIFnMCTL 中的 TXRQST 位这位一旦被设置,相应的报文对象就可以根据优先级和总线是否空闲来发送了注意置位寄存器CANIFnMCTL 中的 RMTEN 位时,如果接受到一个匹配的远程帧时,也能启动发送报文16.2.5 更新一个发送报文对象CPU 可以在任何时候通过 CAN 接口寄存器来更新一个发送报文的数据字节在更新之前寄存器 CANIFnMCTL 中的 TXRQST 位和寄存器 CANIFnARB2 中的 RMTEN 位是不能清零的甚至是当数据字节中的一部分被更新时,在发送寄存器中的内容之前相应的CANIFnDAn/CANIFnDBn 寄存器中的 4 个字节必须有效。
在 CPU 写新数据之前 CPU 将四个字节都写入寄存器 CANIFnDAn/CANIFnDBn 中,或者报文对象被发送到寄存器CANIFnDAn/CANIFnDBn 中为了只更新报文对象中的数据,在寄存器 CANIFnMSKn 中的 WRNRD,DATAA 和 DATAB 位要置位,为尽快传输新的数据,须设置在CANIFnMSKn 寄存器中的的 TXRQST 位 为了避免在结束发送本应在数据更新后继续发送的报文时,清除寄存器 CANIFnMCTL 中的 TXRQST 位NEWDAT 位和 TXRQST 位必须同时置位当新的发送开始时 NEWDAT立马被清零16.2.6 访问接受的报文对象当接受到的报文的仲裁域和控制域(寄存器 CANIFnARB2 和寄存器 CANIFnMCTL 中的ID 位和 XTD 位)完全被移入 CAN 控制器时,CAN 控制器将扫描报文存储器寻找匹配的有效报文对象为了到底目的,控制器通过在寄存器 CANIFnMSKn 中的屏蔽位和使能寄存器 CANIFnMCTL 中的 UMASK 位的使用从报文 1 开始的每个有效的报文对象都将和输入报文对比,来低位在报文存储器中的匹配报文。
如果发现了匹配报文,扫描将结束报文处理器将根据接受的报文书数据帧还是远程帧开始工作16.2.7 接受到一个数据帧报文处理器将控制器中的移位寄存器中的报文存储在报文存储器中的匹配的报文对象中数据字节,所有的仲裁位和 DLC 位都讲存储在相应的报文对象中即使用了仲裁屏蔽,数据字节都将会喝标识符连接寄存器 CANIFnMCTL 中的 NEWDAT 位被置位来表明接收到新的数据CPU 读取报文对象后将清除这个比特位来向控制器指出报文已接受,缓冲器已经空闲可以接受新数据如果 CAN 控制器接受到报文并且 NEWDAT 位已经置位,在CANIFnMCTL 中的 MSGLST 位将将置位来表明以前的数据已经丢失如果系统在成功接收到一个帧后需要中断,寄存器 CANIFnMCTL 中的 RXIE 位须置位,在这种情况下相同寄存器中的 INTPND 位将被控制器置位,从而导致指向报文对象的 CANINT 寄存器仅仅接收一个报文报文对象的 TXRQST 位将被清零来禁止远程帧的发送。