OpenEdv-开源电子网

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

我24位AD(3个字节)采样后通过spi上传给上位机(同时保存在外部SRAM),上传后一开始正常但几次之后数据出错(移位)。

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-8-24
在线时间
76 小时
发表于 2016-4-13 15:03:25 | 显示全部楼层 |阅读模式
5金钱
1.首先定义1个二位数组,再定义4个一位数组。
u8     *pa,*pb,*pc,**px,*py;

2。再分别申请内存
px = (u8 **)mymalloc(sramx,(sizeof(u8 *) * Total_channel_number));    //分配指针数组
px[0] = (u8 *)mymalloc(sramx,(sizeof(u8) * Total_channel_number * lenlen));//一次性分配所有空间  
for(i=1; i<Total_channel_number; i++)   
{  
px[i] = px[i-1] + lenlen;  
}//采用如上内存分配方法,意味着将q的值初始化为m*n的二维数组首地址,且这块内存连续

pa=mymalloc(0,set_Collection_points+2);
pb=mymalloc(0,set_Collection_points+2);
pc=mymalloc(0,set_Collection_points+2);                                                                                 
py=mymalloc(0,len4);

3.上传的数据是*pa,*pb,*pc.我的pa[0],pa[1],pb[0],pb[1],pc[0],pc[1]放的是数据的协议,从pa[2],pb[2],pc[2]开始分别保存ad的高中低3个字节。
                         pa[0]=0x02;
                         pa[1]=0x55;
                         pb[0]=0x04;
                         pb[1]=pd[4];
                         pc[0]=0x55;
                         pc[1]=pd[5];

//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
abc++;
if(abc==set_sampling_rate)
{       
pa[ADS1271_num+2]=SPI1_ReadWriteByte(0xff);
pb[ADS1271_num+2]=SPI1_ReadWriteByte(0xff);
pc[ADS1271_num+2]=SPI1_ReadWriteByte(0xff);
ADS1271_num++;
abc=0;
}
if(ADS1271_num==set_Collection_points)
{
ADS1271_num=0;
flag=1;
PWDN=0;       
EXTI->IMR&=~(1<<0);
}       

4.采样一小次发送完毕之后,将采样一小次将数据保存外部SRAM**px中暂存
for(l=0,j=0;l<set_Collection_points+2;l++,j++)
{
px[next-1][l]=pa[j];
}
for(l=set_Collection_points+2,j=0;l<set_Collection_points+set_Collection_points+4;l++,j++)
{
px[next-1][l]=pb[j];
}
for(l=set_Collection_points+set_Collection_points+4,j=0;l<set_Collection_points+set_Collection_points+set_Collection_points+6;l++,j++)
{
px[next-1][l]=pc[j];
}

myfree(0,pa);//释放内存
myfree(0,pb);//释放内存
myfree(0,pc);//释放内存
5.待采样一大次之后将外部SRAM**px中数据分一定次数传给内部SRAM的*py,写入SD卡。
res=f_open(file,file_name2,FA_CREATE_ALWAYS | FA_WRITE);
for(kp=0;kp<len5;kp++)
{
for(kq=0;kq<len4;kq++)
{
py[kq]=px[kp][kq];               
}
res = f_write(file,py,len4,&bw1);
res = f_lseek(file,file->fsize);                                                  
}
f_close(file);       

myfree(1,px);//释放内存
myfree(0,py);//释放内存

6.现在问题是一开始程序运行正常,待运行多次之后发生了采样的AD数据原来的末尾跑的守卫
例如:(我以5个AD数据为例)
正确的是:(前六位是数据格式始终没问题)
02 04 55 55 01 00         00 01 0F  00 02 78 04 23 12  06 34 65 FF 89 79
错误的是:
02 04 55 55 01 00         79 00 01 0F  00 02 78 04 23 12  06 34 65 FF 89

其实py数组本来可以不用,就怕影响pa,pb,pc,可惜还不行,程序运行不超过10次数据就错误了。
7.希望高手指点一二。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-13 21:06:21 | 显示全部楼层
回复

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-3-13
在线时间
7 小时
发表于 2018-3-14 15:28:11 | 显示全部楼层
求上位机,我现在也在弄SPI通信的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 21:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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