OpenEdv-开源电子网

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

将SD卡工程移植到NRF24L01工程,不能正确写入SD数据

[复制链接]

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-11-8
在线时间
10 小时
发表于 2019-9-7 11:48:42 | 显示全部楼层 |阅读模式
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...");                                       
}  
                        
}

       

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

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10568
金钱
10568
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-9-7 17:51:35 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 12:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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