论坛元老
 
- 积分
- 8980
- 金钱
- 8980
- 注册时间
- 2020-5-11
- 在线时间
- 4550 小时
|
本帖最后由 LcwSwust 于 2023-4-18 10:41 编辑
接上一帖:“基于GD32F303CCT6的OV7670驱动”
http://www.openedv.com/forum.php?mod=viewthread&tid=342658&extra=
此次调试了接收端,图像传输已初步完成,目前帧率为1帧/秒。
而且由于每次采集1/4帧图像,在有运动物体的情况下,图像会出现“错位”。
(后期再考虑图像压缩及语音的传输)
图像为320*240像素,每像素2字节,每行640字节;
NRF地址宽度为3,CRC为1字节,
NRF打包多出部分:1前导+3地址+1.1控制+1CRC=6.1字节;
PAYLOAD为32字节(x+y+30字节图像数据);空中速度2Mbps。
每行图像:320*2/30=22包;
有效载荷:32/(32+6.1)=84%
利用FIFO:1包150us,空中速率约2.032Mbps。
1行数据约3.2ms;
(32+6.1)*22=838.2字节,838.2*8/3.25=2.063Mbps,符合配置。
60行数据约200ms;
加上等待DMA的时间,传输一幅图像(240行)约需1s。
发送端OV7670配置为RGB565模式,
发送流程:
设置好采集启始行,等待DMA采集完成,通过无线模块发出采集数据。
NRF24L01P模块流程:
初始化为发送模式,CE置高,读取TX_FULL状态位,若为0(表示TX_FIFO未满)就
将数据包写入NRF。
接收端直接将数据发给显示屏(SPI接口,2.8寸TFT,320*240)。
接收流程:
NRF24L01P初始化为接收模式,读取RX_EMPTY状态位,若为0(表示RX_FIFO有数据)
就读取数据包,送往TFT显示屏。
电路.rar
(147.26 KB, 下载次数: 34)
程序.rar
(9.27 MB, 下载次数: 49)
发送方核心代码:- //发送一行数据,只要TX_FIFO未满就往里写
- void nrf_txline(U8 y,U8* buf,U16 len)
- {
- U16 x;
- U16 pn,ln;
- U8 buflast[PAYLOAD_SIZE];
- //---------------------------分包有余数的处理
- pn=len/(PAYLOAD_SIZE-2);//完整的包数量
- ln=len%(PAYLOAD_SIZE-2);//有余数(640%30=10)
- for(x=0;x<ln;x++)
- {
- buflast[x]=buf[pn*(PAYLOAD_SIZE-2)+x];
- }
- //---------------------------
- NRF_CE_H;
- for(x=0;x<len/(PAYLOAD_SIZE-2);x++)//每次发送PAYLOAD_SIZE-2个图像数据(因为有两字节座标)
- {
- while(NRF_RwReg(CMD_R_REG+STATUS,0) & BIT(0));//TX_FULL
- //只要TX_FIFO未满,就存入数据,可维持发送状态
- NRF_TxPld(x,y,buf+x*(PAYLOAD_SIZE-2));
- //LED_X;
- }
- //---------------------------分包有余数的处理
- if(ln)
- {
- while(NRF_RwReg(CMD_R_REG+STATUS,0) & BIT(0));//TX_FULL
- //只要TX_FIFO未满,就存入数据,可维持发送状态
- NRF_TxPld(x,y,buflast);//发送最后一包数据
- //LED_X;
- }
- //---------------------------
- NRF_CE_L;
- LED_X;
- }
- //main()
- NRF_TX_INI();//配置为发送模式
- while(1)//NRF发送图像
- {
- for(OV_linestart=0;OV_linestart<CAMHEIGHT;OV_linestart+=DMAHEIGHT)//每次发送320*240*2/4
- {
- OV_capend=0;
- OV_capen=1;//DMA允许采集
- while(OV_capend==0);//等待DMA采集完毕
- LED_ON;
- p=OV_DMAbuf[0];
- for(y=0;y<DMAHEIGHT;y++)
- {
- nrf_txline(y+OV_linestart,OV_DMAbuf[y],DMAWIDTH);//发送一行图像
- }
- LED_OFF;
- }
- }
-
复制代码
接收方核心代码:- NRF_RX_INI();//配置为接收模式
- while(n)
- {
- if((NRF_RwReg(CMD_R_REG+FIFO_STATUS,0)& BIT(0))==0)//RX FIFO非空
- {
- LED_ON;
- NRF_ReadBuf(CMD_R_RX_PAYLOAD,PAYLOAD_SIZE,RF_rxbuf);//读取数据
- NRF_RwReg(CMD_W_REG+STATUS,0xff);//清TX_DS\MAX_RT标志
- x=(U16)RF_rxbuf[0]*((PAYLOAD_SIZE-2)/2);//注意16位像素只有15点宽度
- y=RF_rxbuf[1];
- w=(PAYLOAD_SIZE-2)/2;//图像宽度
- if((x+w)>LCD_WIDTH)//最后一包有多余数据
- w=LCD_WIDTH-x;
- LCD_DisBmp(x,y,w,1,RF_rxbuf+2);//数据写入显示屏
- U0TX(0xaa);
- U0TX(RF_rxbuf[0]);
- U0TX(RF_rxbuf[1]);
- LED_OFF;
- }
-
- }
复制代码
|
|