这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_57 [2020/03/28 11:58] zgf [二、 实验设备及平台] |
icore4t_57 [2022/04/01 10:57] (当前版本) sean |
||
---|---|---|---|
行 3: | 行 3: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-03-28 | gingko | 初次建立 | | | V1.0 | 2020-03-28 | gingko | 初次建立 | | ||
行 19: | 行 18: | ||
{{ :icore4t:icore4t_cube_57_3.png?direct |}} | {{ :icore4t:icore4t_cube_57_3.png?direct |}} | ||
4.时基源选择SysTick | 4.时基源选择SysTick | ||
- | {{ :icore4t:icore4t_cube_57_4png?direct |}} | + | {{ :icore4t:icore4t_cube_57_4.png?direct |}} |
5.将PA10,PB7,PB8设置为GPIO_Output | 5.将PA10,PB7,PB8设置为GPIO_Output | ||
{{ :icore4t:icore4t_cube_57_5.png?direct |}} | {{ :icore4t:icore4t_cube_57_5.png?direct |}} | ||
行 101: | 行 100: | ||
* **闭环总线网络:** | * **闭环总线网络:** | ||
* CAN物理层的形式主要有两种,如下图是其中的一种“闭环网络”,它允许总线最大长度为40m,最高速度为1Mbps,可以看到总线的两端各有一个120欧的电阻,这是规定。节点就是不同的设备,连接到一个闭环总线上面。 | * CAN物理层的形式主要有两种,如下图是其中的一种“闭环网络”,它允许总线最大长度为40m,最高速度为1Mbps,可以看到总线的两端各有一个120欧的电阻,这是规定。节点就是不同的设备,连接到一个闭环总线上面。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_1.png?direct&600 |}} | |
* **开环总线网络:** | * **开环总线网络:** | ||
+ | {{ :icore4t:icore4t_arm_hal_57_2.png?direct&600 |}} | ||
* **通讯节点:** | * **通讯节点:** | ||
* CAN节点是指能够挂接在CAN总线上的单元,并能通过CAN总线实现各个节点间的通信,以实现复杂的控制过程。理论上CAN总线连接的节点可达110个,但实际上收到总线上的时间延迟及电气负载的限制。当连接多节点时,降低通信速率,可连接的节点增加;提高通信速率,则可连接的节点数减少。 | * CAN节点是指能够挂接在CAN总线上的单元,并能通过CAN总线实现各个节点间的通信,以实现复杂的控制过程。理论上CAN总线连接的节点可达110个,但实际上收到总线上的时间延迟及电气负载的限制。当连接多节点时,降低通信速率,可连接的节点增加;提高通信速率,则可连接的节点数减少。 | ||
行 112: | 行 111: | ||
* **CAN协议中的差分信号:** | * **CAN协议中的差分信号:** | ||
* 差分信号又称为差模信号,具体的含义这里不多介绍了。CAN协议中对它使用的CAN_High以及CAN_Low表示的差分信号做了规定,如下图,可以看到,显性电平对应逻辑“0”,隐性电平对应逻辑“1”。当表示为隐性电平(逻辑“1”)时,CAN_High和CAN_Low的电压均为2.5V,此时它们的电压差为0V;当表示显性电平(逻辑“0”)时,CAN_High的电压为3.5V,CAN_Low的电压为1.5V,它们的电压差为2V。举个例子:当CAN收发器从CAN_Tx线接收到来自CAN控制器的低电平信号(逻辑“0”)时,它会使CAN_High输出3.5V,同时CAN_Low输出1.5V。在总线上显性电平具有优先权,只要有一个单元(也就是节点)输出显性电平,总线上即为显性电平。而隐性电平则具有包容的含义,只有所有的单元都输出隐性电平,总线上才为隐性电平。那么可以知道,CAN通讯是半双工的,收发数据需要分开来进行,由于是公用总线,在整个网络中,同一时刻只能由一个通讯节点发送信号,其余的节点在该时刻只能接收。 | * 差分信号又称为差模信号,具体的含义这里不多介绍了。CAN协议中对它使用的CAN_High以及CAN_Low表示的差分信号做了规定,如下图,可以看到,显性电平对应逻辑“0”,隐性电平对应逻辑“1”。当表示为隐性电平(逻辑“1”)时,CAN_High和CAN_Low的电压均为2.5V,此时它们的电压差为0V;当表示显性电平(逻辑“0”)时,CAN_High的电压为3.5V,CAN_Low的电压为1.5V,它们的电压差为2V。举个例子:当CAN收发器从CAN_Tx线接收到来自CAN控制器的低电平信号(逻辑“0”)时,它会使CAN_High输出3.5V,同时CAN_Low输出1.5V。在总线上显性电平具有优先权,只要有一个单元(也就是节点)输出显性电平,总线上即为显性电平。而隐性电平则具有包容的含义,只有所有的单元都输出隐性电平,总线上才为隐性电平。那么可以知道,CAN通讯是半双工的,收发数据需要分开来进行,由于是公用总线,在整个网络中,同一时刻只能由一个通讯节点发送信号,其余的节点在该时刻只能接收。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_3.png?direct&400 |}} | |
- | **协议层:** | + | === 2.协议层: === |
* **CAN的位时序以及同步:** | * **CAN的位时序以及同步:** | ||
* 由于CAN属于异步通讯,没有时钟信号线,那么节点间就需要约定好波特率进行通讯。同时,为实现正确的总线电平采样,确保通讯正常,由此引出“位时序”的概念。 | * 由于CAN属于异步通讯,没有时钟信号线,那么节点间就需要约定好波特率进行通讯。同时,为实现正确的总线电平采样,确保通讯正常,由此引出“位时序”的概念。 | ||
* **位时序的组成:** | * **位时序的组成:** | ||
* CAN协议将每一个数据位的时序分解成4段,即:SS段、PTS段、PBS1段、PBS2段,这4段加起来就是一个CAN数据位的长度。而分解后的最小时间单位是Tq,一个完整的位由8~25个Tq组成。如下图是总线电平下每个位分解。 | * CAN协议将每一个数据位的时序分解成4段,即:SS段、PTS段、PBS1段、PBS2段,这4段加起来就是一个CAN数据位的长度。而分解后的最小时间单位是Tq,一个完整的位由8~25个Tq组成。如下图是总线电平下每个位分解。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_4.png?direct |}} | |
* SS段:称为同步段,用于使总线上的各个节点同步,要求有一个跳变沿位于此段内,该段的长度为1Tq; | * SS段:称为同步段,用于使总线上的各个节点同步,要求有一个跳变沿位于此段内,该段的长度为1Tq; | ||
* PTS段,称为传播时间段,用于补偿网络内的物理延时,它是信号在总线上传播时间,输入比较器延时和输出驱动器延时之和的两倍,该段长可以为1~8Tq; | * PTS段,称为传播时间段,用于补偿网络内的物理延时,它是信号在总线上传播时间,输入比较器延时和输出驱动器延时之和的两倍,该段长可以为1~8Tq; | ||
行 136: | 行 136: | ||
* **CAN报文格式:** | * **CAN报文格式:** | ||
* CAN一共规定了5种类型的帧,分别是:数据帧、遥控帧、错误帧、过载帧、帧间隔,作用见下表。另外,数据帧和遥控帧有标准格式和扩展格式两个,唯一的区别是标识符(ID)不同,在下面数据帧的结构讲解中,我们会对两个格式进行介绍。 | * CAN一共规定了5种类型的帧,分别是:数据帧、遥控帧、错误帧、过载帧、帧间隔,作用见下表。另外,数据帧和遥控帧有标准格式和扩展格式两个,唯一的区别是标识符(ID)不同,在下面数据帧的结构讲解中,我们会对两个格式进行介绍。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_5.png?direct |}} | |
* **数据帧的结构** | * **数据帧的结构** | ||
* 数据帧是CAN通信中最中意、最复杂的报文,以一个显性位(逻辑0)开始,以一个7个连续隐性位(逻辑1)结束。在它们之间分为仲裁段、控制段、数据段、CRC段和ACK段,加上起始和结束总共有7个段。 | * 数据帧是CAN通信中最中意、最复杂的报文,以一个显性位(逻辑0)开始,以一个7个连续隐性位(逻辑1)结束。在它们之间分为仲裁段、控制段、数据段、CRC段和ACK段,加上起始和结束总共有7个段。 | ||
* 在下图中,在标准帧和扩展帧除了ID和DLC之外,还有RTR、IDE、SRR位。首先是RTR位,翻译为远程传输请求位,用显性电平和隐性电平来区分数据帧和遥控帧。然后是IDE位,为标识符扩展位,用显性电平和隐性电平来区分标准格式还是扩展格式。最后是SRR位,只存在于扩展格式,它用于替代标准格式中的RTR位,由于扩展帧中的SRR位为隐性位,RTR是数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级更高。 | * 在下图中,在标准帧和扩展帧除了ID和DLC之外,还有RTR、IDE、SRR位。首先是RTR位,翻译为远程传输请求位,用显性电平和隐性电平来区分数据帧和遥控帧。然后是IDE位,为标识符扩展位,用显性电平和隐性电平来区分标准格式还是扩展格式。最后是SRR位,只存在于扩展格式,它用于替代标准格式中的RTR位,由于扩展帧中的SRR位为隐性位,RTR是数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级更高。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_6.png?direct |}} | |
* **帧起始** | * **帧起始** | ||
* SOF段(Start Of Frame),翻译为帧起始,标准帧和扩展帧都是通过一个显性电平表示帧起始。它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。 | * SOF段(Start Of Frame),翻译为帧起始,标准帧和扩展帧都是通过一个显性电平表示帧起始。它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。 | ||
行 158: | 行 158: | ||
* 由发送节点发送7个隐性位表示结束。 | * 由发送节点发送7个隐性位表示结束。 | ||
- | **STM32的CAN外设简介:** | + | === 3.STM32的CAN外设简介: === |
- | STM32具有bxCAN,是基本扩展CAN,它支持CAN协议2.0A和2.0B。它的设计目标是以最小的CPU负荷来高效处理大量接收到的报文。也支持报文发送的优先级要求(通过软件配置)。bxCAN提供所有支持时间触发通信模式所需的硬件功能。 | + | * STM32具有bxCAN,是基本扩展CAN,它支持CAN协议2.0A和2.0B。它的设计目标是以最小的CPU负荷来高效处理大量接收到的报文。也支持报文发送的优先级要求(通过软件配置)。bxCAN提供所有支持时间触发通信模式所需的硬件功能。 |
- | 该CAN控制器支持最高的通讯速率为1Mb/s;它可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文;外设中具有3个发送邮箱;具有2个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文。具有双CAN,CAN1是主bxCAN,CAN2为从bxCAN。 | + | * 该CAN控制器支持最高的通讯速率为1Mb/s;它可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID的报文;外设中具有3个发送邮箱;具有2个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文。具有双CAN,CAN1是主bxCAN,CAN2为从bxCAN。 |
- | STM32有两组CAN控制器,其中CAN1为主设备,负责管理bxCAN和512字节的SRAM存储器之间的通信;CAN2为从设备,它不能直接访问SRAM存储器。在使用CAN2的时候必须先使能CAN1外设的时钟。 | + | * STM32有两组CAN控制器,其中CAN1为主设备,负责管理bxCAN和512字节的SRAM存储器之间的通信;CAN2为从设备,它不能直接访问SRAM存储器。在使用CAN2的时候必须先使能CAN1外设的时钟。 |
- | + | {{ :icore4t:icore4t_arm_hal_57_7.png?direct |}} | |
**CAN控制内核:** | **CAN控制内核:** | ||
- | 框图中标号①处的CAN控制内核包含了各种控制器及状态寄存器,通过这些寄存器可以配置CAN的参数,如波特率;请求发送报文;处理报文的接收;管理相关中断、获取诊断信息等。由于篇幅原因,这里主要讲解的是主控制器寄存器和位时序控制器。 | + | * 框图中标号①处的CAN控制内核包含了各种控制器及状态寄存器,通过这些寄存器可以配置CAN的参数,如波特率;请求发送报文;处理报文的接收;管理相关中断、获取诊断信息等。由于篇幅原因,这里主要讲解的是主控制器寄存器和位时序控制器。 |
- | 主控制寄存器(CAN_MCR) | + | * 主控制寄存器(CAN_MCR) |
- | DBF调试冻结(DBF) | + | * DBF调试冻结(DBF) |
- | 可设置为调试时的工作状态或者禁止收发的状态,禁止收发时仍然可以访问接收FIFO的中的数据。 | + | * 可设置为调试时的工作状态或者禁止收发的状态,禁止收发时仍然可以访问接收FIFO的中的数据。 |
- | 时间触发通信模式(TTCM) | + | * 时间触发通信模式(TTCM) |
- | 用于运行和禁止时间触发通信模式。在该模式下,CAN硬件的内部定时器被激活,并且产生时间戳,分别存储在CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。 | + | * 用于运行和禁止时间触发通信模式。在该模式下,CAN硬件的内部定时器被激活,并且产生时间戳,分别存储在CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。 |
- | 自动离线管理(ABOM) | + | * 自动离线管理(ABOM) |
- | 该位决定CAN硬件在什么条件下可以退出离线状态,为“1”时,一旦硬件检测到128次11位的连续隐性位,则自动退出离线状态;为“0”时,软件对CAN_MCR寄存器的INRQ位进行置‘1’随后清‘0’后,一旦硬件检测到128次11位连续的隐性位,则退出离线状态。 | + | * 该位决定CAN硬件在什么条件下可以退出离线状态,为“1”时,一旦硬件检测到128次11位的连续隐性位,则自动退出离线状态;为“0”时,软件对CAN_MCR寄存器的INRQ位进行置‘1’随后清‘0’后,一旦硬件检测到128次11位连续的隐性位,则退出离线状态。 |
- | 自动唤醒(AWUM) | + | * 自动唤醒(AWUM) |
- | CAN外设可以使用软件进入低功耗的睡眠模式,使能此功能后,当CAN检测到总线活动的时候,会自动唤醒。 | + | * CAN外设可以使用软件进入低功耗的睡眠模式,使能此功能后,当CAN检测到总线活动的时候,会自动唤醒。 |
- | 自动重传(NART) | + | * 自动重传(NART) |
- | 设置为“0”时,CAN硬件发送报文时会一直重传,直达成功为止;为“1”时,CAN报文只被发送一次,不管有没成功。 | + | * 设置为“0”时,CAN硬件发送报文时会一直重传,直达成功为止;为“1”时,CAN报文只被发送一次,不管有没成功。 |
- | 接收FIFO锁定模式(RFLM) | + | * 接收FIFO锁定模式(RFLM) |
- | 该功能用于锁定接收FIFO,锁定时,接收FIFO溢出时,会丢弃下一个接收到的报文;不锁定,则下一个接收到的报文会覆盖原报文。 | + | * 该功能用于锁定接收FIFO,锁定时,接收FIFO溢出时,会丢弃下一个接收到的报文;不锁定,则下一个接收到的报文会覆盖原报文。 |
- | 发送FIFO优先级(TXFP) | + | * 发送FIFO优先级(TXFP) |
- | 当发送邮箱中有多个报文同时在等待发送时,该位控制是报文的ID来决定还是发送请求的顺序来决定。 | + | * 当发送邮箱中有多个报文同时在等待发送时,该位控制是报文的ID来决定还是发送请求的顺序来决定。 |
- | CAN位时序寄存器(CAN_BTR) | + | * CAN位时序寄存器(CAN_BTR) |
- | 为了方便用于调试,CAN通过设置SILM和LBKM位可以将模式设置为正常模式、静默模式、回环模式和禁止回环模式。 | + | * 为了方便用于调试,CAN通过设置SILM和LBKM位可以将模式设置为正常模式、静默模式、回环模式和禁止回环模式。 |
- | + | {{ :icore4t:icore4t_arm_hal_57_8.png?direct |}} | |
- | CAN发送邮箱 | + | * **CAN发送邮箱** |
- | 在上图中的标号②是CAN外设的发送邮箱,它一共有3个发送邮箱,即可以缓存3个待发送的报文。由发送跳段根据优先级决定哪个邮箱的报文先被发送。 | + | * 在上图中的标号②是CAN外设的发送邮箱,它一共有3个发送邮箱,即可以缓存3个待发送的报文。由发送跳段根据优先级决定哪个邮箱的报文先被发送。 |
- | 每个发送邮箱含有标记符寄存器(CAN_TIxR)、数据长度控制寄存器(CAN_TDTxR)和两个数据寄存器CAN_TDLxR、CAN_TDHxR。 | + | * 每个发送邮箱含有标记符寄存器(CAN_TIxR)、数据长度控制寄存器(CAN_TDTxR)和两个数据寄存器CAN_TDLxR、CAN_TDHxR。 |
- | 当我们要发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并将CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可完成发送。 | + | * 当我们要发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并将CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可完成发送。 |
- | CAN接收FIFO | + | * CAN接收FIFO |
- | CAN外设有2个接收FIFO,每个FIFO有3个邮箱,即可以缓存6个接收到的报文。当接收到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,我们便可以通过状态寄存器获知报文计数器的值。 | + | * CAN外设有2个接收FIFO,每个FIFO有3个邮箱,即可以缓存6个接收到的报文。当接收到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,我们便可以通过状态寄存器获知报文计数器的值。 |
- | 和发送邮箱类似,也有4个寄存器,类型也是一样的。通过中断或者状态寄存器知道接收FIFO有数据后,再读取这些寄存器的值即可把接收到的报文加载到STM32的内存中。 | + | * 和发送邮箱类似,也有4个寄存器,类型也是一样的。通过中断或者状态寄存器知道接收FIFO有数据后,再读取这些寄存器的值即可把接收到的报文加载到STM32的内存中。 |
- | 接收过滤器 | + | * 接收过滤器 |
- | 在CAN协议中,消息的标识符与节点地址无关,但是和消息的内容有关。因此,接收节点会根据标识符的值来确定软件是否需要该消息。STM32在的CAN外设接收报文前会嫌使用接收过滤器进行检查,只接收需要的报文到FIFO中。 | + | * 在CAN协议中,消息的标识符与节点地址无关,但是和消息的内容有关。因此,接收节点会根据标识符的值来确定软件是否需要该消息。STM32在的CAN外设接收报文前会嫌使用接收过滤器进行检查,只接收需要的报文到FIFO中。 |
- | CAN过滤器的寄存器有多个,可以自己看手册进行相应的配置,这里就不多讲解了。过滤的方法有两种模式分别是ID列表模式和掩码模式。 | + | * CAN过滤器的寄存器有多个,可以自己看手册进行相应的配置,这里就不多讲解了。过滤的方法有两种模式分别是ID列表模式和掩码模式。 |
- | + | * 在本实验中,iCore4T使用SN65HVD230作为CAN驱动,通过CAN助手发送数据并能接收数据。 | |
- | + | * 原理图: | |
- | 在本实验中,iCore4T使用SN65HVD230作为CAN驱动,通过CAN助手发送数据并能接收数据。 | + | {{ :icore4t:icore4t_arm_hal_57_9.png?direct&700 |}} |
- | + | ||
- | 原理图: | + | |
- | + | ||
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
=== 1.主函数 === | === 1.主函数 === | ||
行 326: | 行 323: | ||
==== 六、 实验现象 ==== | ==== 六、 实验现象 ==== | ||
* 通过CAN助手,点击发送能够接收到数据说明测试通过。 | * 通过CAN助手,点击发送能够接收到数据说明测试通过。 | ||
- | + | {{ :icore4t:icore4t_arm_hal_57_10.png?direct&700 |}} | |
- | + | {{ :icore4t:icore4t_arm_hal_57_11.png?direct&700 |}} | |
+ | {{ :icore4t:icore4t_arm_hal_57_12.png?direct&700 |}} |