文章

Scheduling transmit CAN message with NTCAN

refer to NTCAN Application Developers Manual document charpter

  • 3.12 Object Mode (Transmit), Scheduling Mode
  • 3.9 Timestamps
  • 4.2.9 canIoctl(), Tx-Object Mode related I/O controls
  • 6.2.7 CSCHED
  • 8 Example Source, Scheduling messages(Classical CAN)

example code

schedtx.c :每隔50毫秒发送一条CAN消息,ID为11-bit的001,data在前5秒内显示为"American"的8字节ASCII数据,后5秒更新为"Canadian"的8字节ASCII数据。计数器使用了一个字节,递增方式(NTCAN_SCHED_FLAG_INC8),占据了data域内的第6个字节位置(从第0个字节开始算起)(NTCAN_SCHED_FLAG_OFS6)。计数器初始值为0xA0,结束值为0x20。

CSCHED data type

  1. NTCAN_SCHED_FLAG_INC8 (INC16, INC32) 1.1 INC8代表使用8-bit的计数器,递增计数。 1.2 INC16代表使用16-bit的计数器,递增计数。 1.3 INC32代表使用32-bit的计数器,递增计数。

  2. NTCAN_SCHED_FLAG_DEC8 (DEC16, DEC32) 2.1 DEC8代表使用8-bit的计数器,递减计数。 2.2 DEC16代表使用16-bit的计数器,递减计数。 2.3 DEC32代表使用32-bit的计数器,递减计数。

  3. NTCAN_SCHED_FLAG_OFS0 (OFS0 - OFS7) 3.1 NTCAN_SCHED_FLAG_OFS0代表在发送的CMSG的8个data域中,从第0个data位置开始用来做计数。 3.1.1 如果使用INC8或者DEC8的flag的话,只占用1个byte,也就是只占用第0个data位置用来做计数。 3.1.2 如果使用INC16或者DEC16的flag的话,将占用2个bytes,也就是占用第0个和第1个,共2个data位置用来计数。 3.1.3 如果使用INC32或者DEC32的flag的话,将占用4个bytes,也就是占用第0个到第3个,共4个data位置用来计数。 3.2 NTCAN_SCHED_FLAG_OFS1代表在发送的CMSG的8个data域中,从第1个data位置开始用来做计数。 3.2.1 如果使用INC8或者DEC8的flag的话,只占用1个byte,也就是只占用第1个data位置用来做计数。 3.2.2 如果使用INC16或者DEC16的flag的话,将占用2个bytes,也就是占用第1个和第2个,共2个data位置用来计数。 3.2.3 如果使用INC32或者DEC32的flag的话,将占用4个bytes,也就是占用第1个到第4个,共4个data位置用来计数。

  4. time_interval 设定发送消息的间隔时间 4.1 请使用example code中的方式来设定间隔时间。

    /*设定间隔为50毫秒*/
    uint64_t timestampFreq;
    uint32_t time_interval_ms=50;
    retvalue = canIoctl(txhandle, NTCAN_IOCTL_GET_TIMESTAMP_FREQ, &timestampFreq);
    schedule.time_interval = ((timestampFreq * time_interval_ms) / 1000ULL);
  1. CSCHED.id值要与CMSG.id的值一样,两者才能在canIoctl NTCAN_IOCTL_TX_OBJ_SCHEDULE时候建立起关联。
	cmsg.id = (uint32_t) 1;
	schedule.id = (uint32_t) 1;

举例说明

  1. schedtx.c中有如下代码片段。
    memset(&cmsg, 0, sizeof(CMSG));
	cmsg.id = (uint32_t) 1;
	cmsg.len = 8;
	strcpy((char *)cmsg.data, "American");

	memset(&schedule, 0, sizeof(CSCHED));
	schedule.id = (uint32_t) 1;
	schedule.flags = NTCAN_SCHED_FLAG_EN|
					 NTCAN_SCHED_FLAG_INC8|
					 NTCAN_SCHED_FLAG_OFS6;
	schedule.time_start = 0;
	schedule.time_interval = ((timestampFreq * time_interval_ms) / 1000ULL);
	schedule.count_start = 0xA0;
	schedule.count_stop = 0x20;
  1. 编译执行,用CANreal抓取此程序发送的CAN消息,txt格式logfilecanreal格式logfile。如下面图一所示,注意其中黄色圈内的数字。初始计数值为0xA0。由于设定的是1个字节计数器(NTCAN_SCHED_FLAG_INC8),计数到0xFF时计数器reset从0重新开始计数,直到0x20计数结束。然后重新从0xA0开始计数。

截图

  1. 图一

schedtx1.png