视频采集端:
/*******************************************************************************
//
// 使用单片机STM32F100C8T6 8
// 晶振:8.00M
// 编译环境 Keil uVision4
// 在3.3V的供电环境下,就能运行
// 波特率 115200
// 使用:STM32F100C8T6串口1连接电脑
*******************************************************************************/
#include "stm32f10x_lib.h"
#include "usart.h"
#include "delay.h"
#include "sys_config.h"
#include "dcmi_ov2640.h"
#include "nrf.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char TxBuf[32]=
{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};
extern u8 TX_ADDRESS[TX_ADR_WIDTH]; //调用外部变量,必须声明!!!!!!!
extern u8 RX_ADDRESS[RX_ADR_WIDTH];
extern u32 JpegDataCnt;
extern u8 JpegBuffer[5120];
extern u8 VsyncActive;
OV2640_IDTypeDef OV2640_Camera_ID;
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
int main(void)
{
u32 i=0;
//u8 m=0;
RCC_Configuration(); //配置RCC
USART1_Configuration(); //配置串口1
Delay_Init(72);
SPI_NRF_Init();
NRF_Check();
NRF_TX_Mode();
OV2640_HW_Init(); //IIC初始化
OV2640_ReadID(&OV2640_Camera_ID); //读取OV2640ID,测试硬件,依次为:0x7F,0xA2,0x26,0x42
OV2640_JPEGConfig(JPEG_160x120); //配置OV2640输出320*240像素的JPG图片
OV2640_BrightnessConfig(0x20);
OV2640_AutoExposure(2);
OV2640_CaptureGpioInit(); //数据采集引脚初始化
EXTI->IMR &= ~EXTI_Line8; //关闭场同步中断
EXTI->EMR &= ~EXTI_Line8;
EXTI->IMR &= ~EXTI_Line12; //关闭像素同步中断
EXTI->EMR &= ~EXTI_Line12;
Delay_nMS(10); //等待图像输出稳定
EXTI->IMR |= EXTI_Line8; //使能场同步中断,准备下次采集
EXTI->EMR |= EXTI_Line8;
while(1)
{
if(VsyncActive == 2)
{
//封帧格式为:0xAA CMD 0x55
while(JpegBuffer[JpegDataCnt]==0) //将后边的无用的0去掉
JpegDataCnt--;
if(JpegBuffer[0]==0xff && JpegBuffer[1]==0xd8 && JpegBuffer[JpegDataCnt-1]==0xff && JpegBuffer[JpegDataCnt]==0xd9)
{
//n=JpegDataCnt/32+1; //数据以32个为一组,进行分组
JpegDataCnt++;
TxBuf[0]=JpegDataCnt>>8;
TxBuf[1]=JpegDataCnt;
NRF_Tx_Dat(TxBuf);
Delay_nMS(10);
//JpegDataCnt=JpegDataCnt+32;
for(i = 0; i < JpegDataCnt; i=i+32)
NRF_Tx_Dat(&JpegBuffer[i]);
//Delay_nMS(5);
}
else JpegDataCnt++ ;
for(i=1;i<JpegDataCnt;i++) //手动清除数组(在不加nrf24l01时,JpegBuffer[0]可以赋值为0,但是此时不能,待解决)
JpegBuffer[i]=0;
JpegDataCnt = 0; //JPEG计数器清零
//Delay_nMS(5);
EXTI->IMR |= EXTI_Line8; //使能场同步中断,准备下次采集
EXTI->EMR |= EXTI_Line8;
//VsyncCnt = 0; //开始下一帧数据采集
}
}
}
接收端:
#include "stm32f10x_lib.h"
#include "sys_config.h"
#include "usart.h"
#include "nrf.h"
#include "delay.h"
#include "wdg.h"
extern u8 TX_ADDRESS[TX_ADR_WIDTH]; //调用外部变量,必须声明!!!!!!!
extern u8 RX_ADDRESS[RX_ADR_WIDTH];
extern u8 flag_usart;
#define uchar unsigned char
#define uint unsigned int
u8 JpegBuffer[10240];
void Delayms(vu32 m)
{
u32 i;
for(; m != 0; m--)
for (i=0; i<10000; i++);
}
u8 check_head(u8 *p)
{
u8 i=2;
while(p[i]==0)
{
if(i>30)
{
if(p[0]==0xff&&p[1]==0xd9) return 0;
else return 1;
}
else i++;
}
return 0;
}
int main(void)
{
u8 rxbuf[32];
u8 status,stat;
u16 i,j, n,m;
u8 first=1 ;
RCC_Configuration();
Delay_Init(72);
USART1_Configuration();
SPI_NRF_Init();
status=NRF_Check();
IWDG_Init(4,250); //与分频数为64,重载值为250,溢出时间为0.4s
status=0;
NRF_RX_Mode();
while(1)
{
while(stat!=1)
{
status=NRF_Rx_Dat(rxbuf);
if(status==1)
{
if(check_head(rxbuf))
{
//不能用位移运算!m=rxbuf[0]<<8+rxbuf[1];
m=rxbuf[0]*256+rxbuf[1];
n=(m-1)/32 +1; //分成n组数据
stat=1;
}
}
//Delay_nUS(1);
}
stat=0;
j=0;
for(i=0;i<n;i++)
{
while(!NRF_Rx_Dat(&JpegBuffer[j])) ;
j=j+32;
}
if(flag_usart==1||first==1)
{
for(i=0;i<m;i++)
USART1_SendData(JpegBuffer[i]);
flag_usart=0;
first=0;
}
IWDG_Feed();//喂狗
}
}