天线|RF射频
直播中

薛静斗

7年用户 194经验值
私信 关注
[问答]

OV7725+NRF24L01无线图像传输无法实现的解决办法?

接下来贴一下主程序,主要是发送端图像显示错位和接收端接收不到数据
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"         
#include "string.h"
#include "ov7725.h"
#include "ov7670.h"
#include "tpad.h"
#include "timer.h"
#include "exti.h"
#include "usmart.h"
#include "24l01.h"
/************************************************
ALIENTEK战舰STM32开发板实验35
摄像头OV7725和OV7670 实验
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"发烧友",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:发烧友 @ALIENTEK
************************************************/
#define  OV7725 1
#define  OV7670 2
//由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
//注意:此宏定义只对OV7725有效
#define  OV7725_WINDOW_WIDTH                320 // <=320
#define  OV7725_WINDOW_HEIGHT                240 // <=240
const u8*LMODE_TBL[6]={"Auto","Sunny","Cloudy","Office","Home","Night"};//6种光照模式            
const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"};        //7种特效
extern u8 ov_sta;        //在exit.c里 面定义
extern u8 ov_frame;        //在timer.c里面定义
u8 tmp_buf[33]="abcdefghijklABCDEFGHIJKLM1234567";
u16 mycolor;
u8  mycolorH,mycolorL;
void OV7725_camera_refresh(void)
        {
        u32 i,j;
        u16 color;
  u8 t=0,sss=0;        
        if(ov_sta)//有帧中断更新
        {
                LCD_Scan_Dir(U2D_L2R);//从上到下,从左到右
                LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT);//将显示区域设置到屏幕中央
                if(lcddev.id==0X1963)
                        LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//将显示区域设置到屏幕中央
                LCD_WriteRAM_Prepare();     //开始写入GRAM        
                OV7725_RRST=0;                                //开始复位读指针
                OV7725_RCK_L;
                OV7725_RCK_H;
                OV7725_RCK_L;
                OV7725_RRST=1;                                //复位读指针结束
                OV7725_RCK_H;
                for(i=0;i                 {
                        for(j=0;j                         {
                                OV7725_RCK_L;
                                color=GPIOC->IDR&0XFF;        //读数据
                                OV7725_RCK_H;
                                color<<=8;  
                                OV7725_RCK_L;
                                color|=GPIOC->IDR&0XFF;        //读数据
                                OV7725_RCK_H;
                                LCD->LCD_RAM=color;
        //LCD_WR_DATA(color);        
        mycolor=color;
                          mycolorL=mycolor&0x00ff;
                          mycolorH=(mycolor>>8)&0x00ff;
                          {
                           tmp_buf[2*t]=mycolorH;
                           tmp_buf[2*t+1]=mycolorL;
                           sss++,t++;
                          }        
        if(sss==16)
                           {
                            while(NRF24L01_TxPacket(tmp_buf)==TX_OK);
                                  sss=0,t=0;
                           }                        
                        }
                }
                                 OV7725_CS=1;                                                         
                OV7725_RCK_L;
                OV7725_RCK_H;
                EXTI_GetITStatus(EXTI_Line8);                     //清除LINE8上的中断标志位
                ov_sta=0;                                        //清零帧中断标记
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
        }
}
int main(void)
{         
        u8 key,mode;
        u16 t=0;                        
        u8 tmp_buf[33];        
                   u8 i=0;                    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        //Stm32_Clock_Init(9);
        delay_init();                             //延时函数初始化         
        uart_init(115200);                         //串口初始化为 115200
        usmart_dev.init(72);                //初始化USMART               
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD  
        TPAD_Init(6);                                //触摸按键初始化
        POINT_COLOR=RED;                        //设置字体为红色
        OV7725_Init();
        NRF24L01_Init();    //初始化NRF24L01
        while(NRF24L01_Check())//检测不到24L01
        {
                //LCD_ShowString(30,30,"24L01 Check Failed!");
                printf("24L01 Check Failed!");
                delay_ms(500);
        }
        NRF24L01_TX_Mode();
        printf("24L01 Check OK!");
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD
        if(lcddev.id==0X6804)         //强制设置屏幕分辨率为320*240.以支持3.5寸大屏
        {
                lcddev.width=240;
                lcddev.height=320;
        }
        usmart_dev.init(72);        //初始化USMART               
                           
        POINT_COLOR=RED;//设置字体为红色
        while(OV7725_Init())//初始化OV7725
        {
                printf("OV7725 Error!!");
                delay_ms(200);
        }
    printf("OV7725 Init OK");
        delay_ms(1500);                              
        TIM6_Int_Init(10000,7199);        //10Khz计数频率,1秒钟中断                                                                          
        EXTI8_Init();                                //使能定时器捕获        
        OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,1);        //设置窗口         
          OV7725_CS=0;                                                         
        while(1)
        {        
                OV7725_camera_refresh();        //更新显示         
                if(i!=ov_frame)                //DS0闪烁.
                {
                        i=ov_frame;
                        LED0=!LED0;
                }
        }           
}

回帖(2)

赵勇

2020-6-17 16:35:54
然后接收端最后数据显示在LCD上程序编译不通过,不知道怎么解决了,求助。
#include "stm32f10x.h"
#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"          
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
#include "24cxx.h"
//#include "flash.h"
#include "touch.h"
#include "24l01.h"
//Mini STM32开发板范例代码19
//无线通信实验
//发烧友@ALIENTEK
//技术论坛:www.openedv.com
                                                                                                                                                  
//收发都做在一个函数里面,通过按键来确定进入发送模式,还是接收模式                                                                                                                                               
int main(void)
{       
//        u8 key,mode;
    u16        wqh_times=4800;
        u8 t=0;                         
        u8 tmp_buf[33];
          Stm32_Clock_Init(9);//系统时钟设置
        delay_init(72);                //延时初始化
        uart_init(72,9600); //串口1初始化
        delay_ms(200);           
        LCD_Init();                        //初始化液晶
        delay_ms(200);                   
        KEY_Init();                 //按键初始化
        LED_Init();         //LED初始化
        NRF24L01_Init();    //初始化NRF24L01
        POINT_COLOR=RED;//设置字体为红色          
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"NRF24L01 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/17");                          
        while(NRF24L01_Check())//检测不到24L01
        {
                LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
                delay_ms(500);
                LCD_Fill(30,130,239,130+16,WHITE);
                delay_ms(500);
                LED0=!LED0;//DS0闪烁
        }
//        LCD_ShowString(60,130,"24L01 Ready!");
//        LCD_ShowString(10,150,"KEY0:RX_Mode  KEY1:TX_Mode");
        LCD_Fill(10,150,240,166,WHITE);//清空上面的显示                  
        POINT_COLOR=BLUE;//设置字体为蓝色          
        {
                LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");       
                LCD_ShowString(30,170,200,16,16,"Received DATA:");       
                NRF24L01_RX_Mode();                  
                while(1)
                {       
                if(wqh_times==4800)
                {
                                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
                LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右
                LCD_SetCursor(0x00,0x0000);        //设置光标位置
                LCD_WriteRAM_Prepare();     //开始写入GRAM               
                wqh_times=0;       
                }
                                                                                           
                        if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                        {
                                //tmp_buf[32]=0;//加入字符串结束符
//                                LCD_ShowString(0,190,tmp_buf);
                for(t=0;t<16;t++)
                LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
                                wqh_times++;
                        }
       
                                                    
                }       
        }           
}
举报

刘永杰

2020-6-17 16:53:15
根据报错分析问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分