发新帖我要提问
12
返回列表
打印
[应用相关]

STM32 CANOPEN 调试答疑:

[复制链接]
楼主: 東南博士
手机看帖
扫描二维码
随时随地手机跟帖
21
東南博士|  楼主 | 2018-8-22 10:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
4.PDO
PDO 是用来发送(TPDO)或者接收(RPDO)数据的,有几种不同的触发方式,比如:事件触发、同步触发等等。数据内容一般有CANOpen的各个应用协议规定,比如401文档中的AI(Analog Input)数据等。PDO的数据内容是通过映射的方式在定义在OD中的,一个节点可以有多个PDO通道。PDO的通信参数也可以通过SDO访问OD的方式来修改。

使用特权

评论回复
22
東南博士|  楼主 | 2018-8-22 10:34 | 只看该作者
5.应急报文
应急报文用于返回一个节点上的错误,可以是CANOpen命令解析错误,等等。

使用特权

评论回复
23
一路向北lm| | 2018-8-22 11:24 | 只看该作者
東南博士 发表于 2018-8-22 10:18
问题2:还是收不到报文  

此时注意到用于can收发的定时器TIM4的配置没更改过来

这个源码是canfestival?

使用特权

评论回复
24
一路向北lm| | 2018-8-22 11:27 | 只看该作者
总结的不错,我也研究了一段时间,商业源码比较好用。

使用特权

评论回复
25
東南博士|  楼主 | 2018-8-22 14:42 | 只看该作者
商业源码?
请问 哪里提供商业源码?

使用特权

评论回复
26
東南博士|  楼主 | 2018-8-22 14:43 | 只看该作者
是canfestival

使用特权

评论回复
27
東南博士|  楼主 | 2018-8-22 14:50 | 只看该作者
CAN发送邮箱

STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。

使用特权

评论回复
28
東南博士|  楼主 | 2018-8-22 14:50 | 只看该作者
下图是发送邮箱的状态图:

使用特权

评论回复
29
東南博士|  楼主 | 2018-8-22 14:51 | 只看该作者
发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。

使用特权

评论回复
30
東南博士|  楼主 | 2018-8-22 14:51 | 只看该作者
2 发送优先级

          如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。
FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

使用特权

评论回复
31
東南博士|  楼主 | 2018-8-22 14:52 | 只看该作者
3 取消发送

发送邮箱中待发送的报文在正常发送成功之前也可以中途取消,通过对CAN_TSR寄存器的ABRQ位置’1’,可以中止发送请求。

当发送邮箱处于挂号或预定状态时:发送请求马上就被中止了。
当发送邮箱处于发送状态时:
         那么中止请求可能导致2种结果:
                    1:如果邮箱中的报文被成功发送,那么邮箱变为空邮箱,并且CAN_TSR寄存器(CAN发送状态寄存器)的TXOK位被硬件置’1’;

                    2:如果邮箱中的报文发送失败了,那么邮箱变为预定状态,然后发送请求被中止,邮箱变为空邮箱且TXOK位被硬件清’0’。

       因此,不管如何,一旦取消发送,那么在发送操作结束后,邮箱都会变为空邮箱。

使用特权

评论回复
32
東南博士|  楼主 | 2018-8-22 14:52 | 只看该作者
/**
  * @brief  Cancels a transmit request.
  * @param  CANx: where x can be 1 or 2 to select the CAN peripheral.
  * @param  Mailbox: Mailbox number.
  * @retval None
  */
void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox);

使用特权

评论回复
33
東南博士|  楼主 | 2018-8-22 14:52 | 只看该作者
4 自动重传模式

该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式(禁止自动重传)。
在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。
在一次发送操作结束后,硬件认为发送请求已经完成,从而对CAN_TSR寄存器的RQCP位置’1’,同时发送的结果反映在TXOK、ALST和TERR位上。

使用特权

评论回复
34
東南博士|  楼主 | 2018-8-22 14:53 | 只看该作者
5 发送邮箱的组成

说了那么多,那个三个发送邮箱的结构到底是怎么样的呢?与接收FIFO的邮箱类似,发送邮箱也是由四个寄存器组成:发送邮箱标识符寄存器(CAN_TIxR x=0..2),发送邮箱长度和时间戳寄存器(CAN_TDTxR x=0..2),发送邮箱低字节数据寄存器(CAN_TDLxR x=0..2),发送邮箱高字节寄存器(CAN_TDHxR x=0..2)。

使用特权

评论回复
35
東南博士|  楼主 | 2018-8-22 14:53 | 只看该作者

CanTxMsg TxMessage;
int i;

if(id_fmt == STD_ID)//如果是标准CAN ID
{
    TxMessage.StdId = send_frame->id;  //设置标准CAN ID
    TxMessage.IDE = CAN_ID_STD;   //设置IDE为标准CAN ID
}
else
{   
    TxMessage.StdId = (send_frame->
    id >>18) & 0x7FF; //设置扩展CAN ID的标准基本ID部分   
    TxMessage.ExtId = send_frame->id & 0x3FFFF;     //设置扩展CAN ID的扩展ID部分
    TxMessage.IDE = CAN_ID_EXT;   //设置IDE为扩展CAN ID
}

TxMessage.RTR = CAN_RTR_DATA; //数据帧
TxMessage.DLC = 8;  //数据长度
for(i=0;i<8;i++)
{
    TxMessage.Data[i] = send_frame->data_buff[i];
}

CAN_Transmit(CAN1,&TxMessage);

使用特权

评论回复
36
飞扬自我| | 2018-10-15 10:52 | 只看该作者
你好,请问怎么样读取OD的值呢?
我一直读取0x6200 01的值读取失败

使用特权

评论回复
37
Diyer2015| | 2018-10-15 11:09 | 只看该作者
这个 注意一下字典编写

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则