【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯
<p align="center">【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯</p><ul>
<li >can通讯硬件
<ol>
<li >根据AT32WB415数据手册得知,此芯片拥有1路CAN通讯接口(2.0B主动),内置256字节的专用SRAM。</li>
<li >控制器区域网络(CAN) </li>
</ol>
</li>
</ul>
<p >1个CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的 标准帧和29位标识符的扩展帧。具有3个发送邮箱,2个具3级深度的接收FIFO,和14个可调节的滤 波器。CAN控制器分配有256个字节的专用SRAM,此专用SRAM不和其他硬件外设共享。</p>
<ol>
<li style="list-style-type:none">
<ol start="3">
<li >CAN接口,默认PA11、PA12或者重映射PB8、PB9。因为PA11PA12被USB接口所占用,故而应该选择的是PB8/PB9。</li>
<li >板载没有CAN PHY芯片,故需要外置。。。。</li>
</ol>
</li>
</ol>
<p > </p>
<p > </p>
<p > </p>
<p > </p>
<ul>
<li >Can通讯程序示例</li>
</ul>
<p >2.1、打开了candemo,CAN 初始化内有baudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) ,波特率计算公式,CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。</p>
<p > </p>
<p > </p>
<p >2.2、communication_mode 程序示例如以下两图,</p>
<p >其功能是循环发送一组数据,但接收到电脑端数据时LED2会点亮或者熄灭。</p>
<p > </p>
<p > </p>
<p > </p>
<p >2.3、filter例程</p>
<p >自动发送出一组数据,包含标准帧和扩展帧。</p>
<p > </p>
<p >2.4、loopback_mode例程</p>
<p >以回环的形式循环发送数据,上位机发送数据LED3会点亮后熄灭。</p>
<p > </p>
<ul>
<li >代码</li>
</ul>
<p >3.1、原有发送代码需要稍微改变一下,个人以最简单的方式做了调整,在之后的数据发送调用此函数即可。</p>
<p >static void can_transmit(unsigned int id,unsigned char *buf)</p>
<p >{</p>
<p > uint8_t transmit_mailbox;</p>
<p > can_tx_message_type tx_message_struct;</p>
<p > tx_message_struct.standard_id = id; // 标准帧ID</p>
<p > tx_message_struct.extended_id = 0; // 扩展帧ID</p>
<p > tx_message_struct.id_type = CAN_ID_STANDARD; // 标准帧或者扩展帧</p>
<p > tx_message_struct.frame_type = CAN_TFT_DATA; // 帧类型 数据帧或者远程帧</p>
<p > tx_message_struct.dlc = 8; // 数据长度</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > tx_message_struct.data = buf;</p>
<p > transmit_mailbox = can_message_transmit(CAN1, &tx_message_struct); // 数据发送函数</p>
<p > while(can_transmit_status_get(CAN1, (can_tx_mailbox_num_type)transmit_mailbox) != CAN_TX_STATUS_SUCCESSFUL);//获取发送是否完成</p>
<p >}</p>
<p >3.2、初始化代码</p>
<p >/* can base init */</p>
<p > can_default_para_init(&can_base_struct); //</p>
<p > can_base_struct.mode_selection = CAN_MODE_COMMUNICATE; // can模式选择</p>
<p > can_base_struct.ttc_enable = FALSE; // 开启/关闭时间触发通信模式 </p>
<p > can_base_struct.aebo_enable = TRUE;// 自动退出离线状态模式使能</p>
<p > can_base_struct.aed_enable = TRUE;// 自动退出睡眠模式使能</p>
<p > can_base_struct.prsf_enable = FALSE;// 发送失败时禁止重传使能</p>
<p > can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED; // 接收溢出时报文丢弃规则选择</p>
<p > can_base_struct.mmssr_selection = CAN_SENDING_BY_ID; // 多报文发送顺序规则选择</p>
<p > can_base_init(CAN1, &can_base_struct); //</p>
<p>CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?</p>
lugl4313820 发表于 2022-8-11 21:39
CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?
<p>别差太多就行 比方说250K波特率 实际200-300k波特率也可以用。雅特力这个芯片APB1总线频率75Mhz 按公式计算后也不是1M的整数。</p>
页:
[1]