【AT-START-F425测评】USB转CAN之四 完成收发测试
<p>【AT-START-F425测评】USB转CAN 预告帖 https://bbs.eeworld.com.cn/thread-1199896-1-1.html</p><p>【AT-START-F425测评】USB转CAN之二 https://bbs.eeworld.com.cn/thread-1199901-1-1.html</p>
<p>【AT-START-F425测评】USB转CAN之三 https://bbs.eeworld.com.cn/thread-1200055-1-1.html</p>
<p>早上起来继续搬砖,昨晚很晚把CAN收到的数据通过虚拟串口转发,今天早起来仔细看了一下CAN的发送函数,先不填充数,实现接收到串口数据标志后,先测试是否能够触发CAN数据发送:</p>
<p>CAN的发送函数 void can_transmit_data(void)。这个函数是做测试用的,只是添加了固定的数据,测试成功后,设置参与传入,实现动态数据转发。</p>
<pre>
<code>/**
*@brief can transmit data
*@paramnone
*@retval none
*/
void can_transmit_data(void)
{
uint8_t transmit_mailbox; //这里是作为发送成的状态标志
can_tx_message_type tx_message_struct; //初始化发送结构体
tx_message_struct.standard_id = 0x400;//发送给接收者的ID
tx_message_struct.extended_id = 0; //作为标准ID 扩展ID不设置
tx_message_struct.id_type = CAN_ID_STANDARD;//标准帧
tx_message_struct.frame_type = CAN_TFT_DATA;//数据帧
tx_message_struct.dlc = 8; //数据长度
tx_message_struct.data = 0x11; //发送的数据
tx_message_struct.data = 0x22;
tx_message_struct.data = 0x33;
tx_message_struct.data = 0x44;
tx_message_struct.data = 0x55;
tx_message_struct.data = 0x66;
tx_message_struct.data = 0x77;
tx_message_struct.data = 0x88;
transmit_mailbox = can_message_transmit(CAN1, &tx_message_struct);//开始发送
//等待数据发送完毕,备注:!!这里在实际工程中一定要加入超时函数,要不没有接收方返回数据,就会阻塞在这里,程序卡死!
while(can_transmit_status_get(CAN1, (can_tx_mailbox_num_type)transmit_mailbox) != CAN_TX_STATUS_SUCCESSFUL);
}</code></pre>
<p>然后到修改串口接收函数:</p>
<pre>
<code>void test_usb_uart(void)
{
uint16_t data_len;
uint32_t timeout;
uint8_t buff2[] = "mytest";
data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, usb_buffer);
if(data_len > 0)
{
can_transmit_data();
// usb_vcp_send_data(&otg_core_struct.dev, &buff2, sizeof(buff2));
}
}</code></pre>
<p>这样程序修改结束,下载后实验现象:</p>
<p> 这样就实验了数据相互转化测试了。基本功能已经实现。</p>
<p>【下一步想法】从串口助接受的命令定义。实现发送数据的封装。实现数据转发给CAN总线。</p>
<p>离自己的设计越来越近了,也不知道下步会有什么坑。。。大家支持一下,点点赞吧!</p>
<p>速度很快啊</p> <p>增加发送函数:</p>
<pre>
<code>/**
*@brief CAN发送的程序
*@param8位发送数据
*@param需要发送的ID
*@param发送数的长度
*@retval none
*/
void can_transmit_data(uint8_t tran_data,uint16_t id, uint8_t len)
{
uint8_t transmit_mailbox;
can_tx_message_type tx_message_struct;
tx_message_struct.standard_id = id;
tx_message_struct.extended_id = 0;
tx_message_struct.id_type = CAN_ID_STANDARD;
tx_message_struct.frame_type = CAN_TFT_DATA;
tx_message_struct.dlc = len;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
tx_message_struct.data = tran_data;
transmit_mailbox = can_message_transmit(CAN1, &tx_message_struct);
while(can_transmit_status_get(CAN1, (can_tx_mailbox_num_type)transmit_mailbox) != CAN_TX_STATUS_SUCCESSFUL);
}</code></pre>
<p>修改串口接收函数:</p>
<pre>
<code>/**
* @brief这是一个串口转CAN的函数
* @paramnone
* @retval none
*/
void test_usb_uart(void)
{
uint16_t data_len;
uint32_t timeout;
uint8_t can_buff2;
data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, can_buff2);
if(data_len == 8)//暂时先判断接收为8位才发送
{
can_transmit_data(can_buff2,0x0200,8);
}
}</code></pre>
<p>实验现象:</p>
<p> </p>
littleshrimp 发表于 2022-4-16 08:33
速度很快啊
<p>9点半钟回老家看父母,现在紧着时间修改。</p>
<p>主要还有CAN接收,这个我感觉会有一些坑等待你踩<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/lol.gif" width="48" /></p>
wangerxian 发表于 2022-4-17 08:06
主要还有CAN接收,这个我感觉会有一些坑等待你踩
<p>接收没有问题了,昨晚发了帖子,还没给审核。</p>
<p>up你好,请问这个有没有完整的工程源码文件分享</p>
<p>学习了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>你好有源码吗</p>
<p> </p>
HeTui 发表于 2024-11-14 21:56
你好有源码吗
<p>这么久了,不一定能找到了,代码都帖出来了,按我的文章一步一步可以做出来的,有问题时再来这里讨论吧。</p>
lugl4313820 发表于 2024-11-15 10:20
这么久了,不一定能找到了,代码都帖出来了,按我的文章一步一步可以做出来的,有问题时再来这里讨论吧。 ...
<p>想着有工程的话,会方便一点学习</p>
HeTui 发表于 2024-11-15 10:21
想着有工程的话,会方便一点学习
<p>官方有详细的工程例程的,你先去弄个开发板,他家的产品不错的。</p>
页:
[1]