雨夜很凉快 发表于 2022-8-11 16:37

【雅特力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)&nbsp;</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 >&nbsp;</p>

<p >&nbsp;</p>

<p > &nbsp;</p>

<p >&nbsp;</p>

<ul>
        <li >Can通讯程序示例</li>
</ul>

<p >2.1、打开了candemo,CAN 初始化内有baudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) ,波特率计算公式,CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >2.2、communication_mode 程序示例如以下两图,</p>

<p >其功能是循环发送一组数据,但接收到电脑端数据时LED2会点亮或者熄灭。</p>

<p >&nbsp;</p>

<p > &nbsp;</p>

<p > &nbsp;</p>

<p >2.3、filter例程</p>

<p >自动发送出一组数据,包含标准帧和扩展帧。</p>

<p > &nbsp;</p>

<p >2.4、loopback_mode例程</p>

<p >以回环的形式循环发送数据,上位机发送数据LED3会点亮后熄灭。</p>

<p > &nbsp;</p>

<ul>
        <li >代码</li>
</ul>

<p >3.1、原有发送代码需要稍微改变一下,个人以最简单的方式做了调整,在之后的数据发送调用此函数即可。</p>

<p >static void can_transmit(unsigned int id,unsigned char *buf)</p>

<p >{</p>

<p >&nbsp;&nbsp;uint8_t transmit_mailbox;</p>

<p >&nbsp;&nbsp;can_tx_message_type tx_message_struct;</p>

<p >&nbsp;&nbsp;tx_message_struct.standard_id = id; // 标准帧ID</p>

<p >&nbsp;&nbsp;tx_message_struct.extended_id = 0; // 扩展帧ID</p>

<p >&nbsp;&nbsp;tx_message_struct.id_type = CAN_ID_STANDARD; // 标准帧或者扩展帧</p>

<p >&nbsp;&nbsp;tx_message_struct.frame_type = CAN_TFT_DATA; // 帧类型 &nbsp;数据帧或者远程帧</p>

<p >&nbsp;&nbsp;tx_message_struct.dlc = 8; // 数据长度</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;tx_message_struct.data = buf;</p>

<p >&nbsp;&nbsp;transmit_mailbox = can_message_transmit(CAN1, &amp;tx_message_struct); // 数据发送函数</p>

<p >&nbsp;&nbsp;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 >&nbsp;&nbsp;can_default_para_init(&amp;can_base_struct);&nbsp;//</p>

<p >&nbsp;&nbsp;can_base_struct.mode_selection = CAN_MODE_COMMUNICATE;&nbsp;&nbsp;// can模式选择</p>

<p >&nbsp;&nbsp;can_base_struct.ttc_enable = FALSE;&nbsp;// 开启/关闭时间触发通信模式&nbsp;</p>

<p >&nbsp;&nbsp;can_base_struct.aebo_enable = TRUE;// 自动退出离线状态模式使能</p>

<p >&nbsp;&nbsp;can_base_struct.aed_enable = TRUE;// 自动退出睡眠模式使能</p>

<p >&nbsp;&nbsp;can_base_struct.prsf_enable = FALSE;// 发送失败时禁止重传使能</p>

<p >&nbsp;&nbsp;can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED;&nbsp;// 接收溢出时报文丢弃规则选择</p>

<p >&nbsp;&nbsp;can_base_struct.mmssr_selection = CAN_SENDING_BY_ID;&nbsp;// 多报文发送顺序规则选择</p>

<p >&nbsp;&nbsp;can_base_init(CAN1, &amp;can_base_struct);&nbsp;//</p>

lugl4313820 发表于 2022-8-11 21:39

<p>CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?</p>

雨夜很凉快 发表于 2022-8-12 12:43

lugl4313820 发表于 2022-8-11 21:39
CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?

<p>别差太多就行&nbsp;比方说250K波特率&nbsp;实际200-300k波特率也可以用。雅特力这个芯片APB1总线频率75Mhz&nbsp;按公式计算后也不是1M的整数。</p>
页: [1]
查看完整版本: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯