OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2285|回复: 13

求助关于can iap的问题。希望大神或者原子哥能解答一下

[复制链接]

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
发表于 2018-1-20 17:28:34 | 显示全部楼层 |阅读模式
5金钱
iap方面通过void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)。跳转什么的都可以成功。
问题在于appbuf怎么从can得到,我通过一个软件能从pc端通过can发送bin文件到单片机,单片机要怎么把这个bin文件转为数据呢?
u8 Can_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据       
    for(i=0;i<8;i++)
    buf[i]=RxMessage.Data[i];  
        CAN_ID=RxMessage.StdId;//读取CAN的ID数据
        return RxMessage.DLC;        //返回接收的数据长度
}
我接触的can都是一个id只接收8个数据位,然后处理数据,现在不知道怎么才能接收一整个bin文件然后转移到appbuf里面。

原子哥的串口iap中是这样设定的
#define USART_REC_LEN                          55*1024 //定义最大接收字节数 55K
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.
//(这个设定我也没懂什么意思,我的SD卡升级程序中没有这个设定也能正常升级程序)

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
        {         
                res=USART_ReceiveData(USART1);
                if(USART_RX_CNT<USART_REC_LEN)
                {
                        USART_RX_BUF[USART_RX_CNT]=res;
                        USART_RX_CNT++;                                                                                                      
                }
        }

原子哥是在串口中断把数据一个个接收然后存到USART_RX_BUF里面作为appbuf,但是我的can的话要怎么才能这样处理,(最好就不要用到can中断。)

最佳答案

查看完整内容[请看2#楼]

bin文件就是最原始的的二进制文件了,不管三七二十一,将接收到的数据,写入你指定的flash地址即可。相反,如果是hex文件,还要作解析提取有效数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-20 17:28:35 | 显示全部楼层
bin文件就是最原始的的二进制文件了,不管三七二十一,将接收到的数据,写入你指定的flash地址即可。相反,如果是hex文件,还要作解析提取有效数据。
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-20 17:29:46 | 显示全部楼层
原理什么的都懂,,希望有大神能具体的程序能解决这个问题的,这个转换我脑子转不过弯来。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-1-20 21:57:47 | 显示全部楼层
你先搞定CAN通讯再说,不然步子跨大了,容易。。。
一分耕耘一分收获。
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-20 22:00:41 | 显示全部楼层
yklstudent 发表于 2018-1-20 21:57
你先搞定CAN通讯再说,不然步子跨大了,容易。。。

can通信搞定了啊,能接收并处理数据
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-20 23:35:11 | 显示全部楼层
边接收边写flash,不用浪费这么大的内存。
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-21 09:04:51 | 显示全部楼层
Acuity 发表于 2018-1-20 23:35
边接收边写flash,不用浪费这么大的内存。

谢谢,因为can每次都只是8个8位的数据,比如00 11 22 33 44 55 66 77这样子。那我要怎么让can接收到bin的那么多个二进制的文件。。这个弯我转不过来。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-21 09:11:16 | 显示全部楼层
shmilyzgc 发表于 2018-1-21 09:04
谢谢,因为can每次都只是8个8位的数据,比如00 11 22 33 44 55 66 77这样子。那我要怎么让can接收到bin的 ...

一个bin文件就是n个8字节,要么你通信协议里面增加一个发送完成标志。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-1-21 09:16:45 | 显示全部楼层
协议啊;CAN不是有帧ID嘛;
数据ID,数据完成ID,这些还不是完全由你随便定义使用
一分耕耘一分收获。
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-21 09:40:10 | 显示全部楼层
Acuity 发表于 2018-1-21 09:11
一个bin文件就是n个8字节,要么你通信协议里面增加一个发送完成标志。

我先试一下能不能行。
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-21 09:40:56 | 显示全部楼层
yklstudent 发表于 2018-1-21 09:16
协议啊;CAN不是有帧ID嘛;
数据ID,数据完成ID,这些还不是完全由你随便定义使用

道理都懂,,,就是实现不了。我等一下看看帖代码上来
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-21 09:43:28 | 显示全部楼层
Acuity 发表于 2018-1-21 09:11
一个bin文件就是n个8字节,要么你通信协议里面增加一个发送完成标志。

你搞过没有?有没有代码参考一下之类的
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-1-21 22:08:40 | 显示全部楼层
shmilyzgc 发表于 2018-1-21 09:43
你搞过没有?有没有代码参考一下之类的

以前的设备,托上百个CAN节点,IAP就是这种模式。
大体情况就是:
开始帧:0x01+命令
数据帧(n帧):0x02+数据
接收帧:0x03+结束命令
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-14
在线时间
12 小时
 楼主| 发表于 2018-1-24 16:23:59 | 显示全部楼层
已经解决了。就是跟串口IAP一个意思。后续再改进吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 07:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表