初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2017-11-8
- 在线时间
- 10 小时
|
1金钱
查看了电路的引脚配置,没有冲突,程序也能运行。主程序循环接收10次串口1的数据,存入SD卡之后,通过无线发射出去,无线接收的数据经验证都是对的。
但是流程3写入SD卡的数据经验证,总是不正确。菜鸟一只,请求有经验的大神指导下。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "usart2.h"
#include "led.h"
#include "lcd.h"
#include "spi.h"
#include "key.h"
#include "24l01.h"
#include "key.h"
#include "malloc.h"
#include "sdio_sdcard.h"
// 无线工程本来是每次发32个字节
//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK
u8*WriteSendBuf;
//通过串口打印SD卡相关信息
int main(void)
{ u16 key,mode;
u16 t,tt,ttt;
u32 sd_size;
u8 *buf;
u8 TT[8];
u8 SS[6];
u8 tmp_buf[32];
u16 i;
u16 j;
TT[0]=0XA5;
TT[1]=0XF0;
TT[2]=0X02;
TT[3]=0X94;
TT[4]=0X02;
TT[5]=0XC1;
TT[6]=0XA5;
TT[7]=0X20;
SS[0]=0XA5;
SS[1]=0XF0;
SS[2]=0X02;
SS[3]=0X00;
SS[4]=0X00;
SS[5]=0X57;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
usart2_init(42,115200);
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //LCD初始化
KEY_Init(); //按键初始化
NRF24L01_Init();
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMCCM); //初始化CCM内存池
while(SD_Init())//检测不到SD卡
{
LCD_ShowString(10,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(20,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
POINT_COLOR=BLUE; //设置字体为蓝色
//检测SD卡成功
LCD_ShowString(10,150,200,16,16,"SD Card OK ");
LCD_ShowString(20,170,200,16,16,"SD Card Size: MB");
LCD_ShowNum(30+13*8,170,SDCardInfo.CardCapacity>>20,5,16);//显示SD卡容量
while(NRF24L01_Check())//无线自检
{
LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(144,130,200,16,16,"NRF24L01 OK");
//循环检测10个点
//以下检测10次
for (ttt=0;ttt<10;ttt++)
{
//流程1:开始一次360度扫描,接收一个高度测试点的数据
for(i=0;i<8;i++) //启动扫描仪
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART1,TT);
}
while(USART_RX_STA<8005);//等待一个测试点360一周的扫描仪数据传入串口
for(j=0;j<6;j++) //停止扫描仪
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART1,SS[j]);
}
//流程2:添加报文尾巴信息,此处可以添加高度距离信息
for(i=8005;j<8192;i++)
{
USART_RX_BUF=i-8005;
}
//流程3:数据写入SD卡
WriteSendBuf = mymalloc(0,8192); //申请片上8192字节
for(i=0;i<8192;i++)
{
*(WriteSendBuf+i) = USART_RX_BUF;
}
if((SD_WriteDisk((u8*)WriteSendBuf,0+ttt*16,16)==0))//从扇区0开始写入512字节的数据
USART_RX_STA=0;// 为下次接收SCAN数据准备
myfree(0,WriteSendBuf); //释放内存
//流程4:无线发射
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");
NRF24L01_TX_Mode();
key=0;//
tt=10;
while(key<8192)
{
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)//测试无线连接是否完好,如果完好,则此处会发射随机32个随机数
{
for(t=0;t<32;t++)
{
tmp_buf[t]=USART_RX_BUF[key];
key++;
delay_us(5); //此处延时和串口发送的目的是等待无线接收处理完毕。
USART_SendData(USART2, tmp_buf[t]); //原因是因为单片机B接收到无线信号后,需要通过串口上传数据,
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//因此速度跟不上单片机A的单一无线发送数据速度,出现了丢数据的现象。
}
}
else
{
delay_us(10);
tt--;
if(tt==0) break;
}
}
}
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
mode=0;
}
if(mode=0)//key0 读SD卡,串口1输出到电脑
{
buf=mymalloc(0,8192); //申请内存
for(i=0;i<10;i++)
{
if(SD_ReadDisk(buf,0+16*i,16)==0) //读取0扇区的内容
{
for(sd_size=0;sd_size<8192;sd_size++)
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART2,buf); //打印0扇区数据
}
}
}
myfree(0,buf); //释放内存
LCD_ShowString(190,190,200,16,16," SD Sending Data VICTORY...");
} //释放内存 //释放内存
LCD_ShowString(190,190,200,16,16," SD Sending Data VICTORY...");
}
}
|
|