📄 gxtm201.c
字号:
#include"71x_type.h"
#include "uart.h"
extern void Delay_NS(u32 dly);
///////////////////////////////////////////////////////////////////////////////
u8 CAM_SendBuf[6]; //命令
u8 CAM_ReceiveBuf[600];
u8 CAM_ReceiveLen;
u16 UARTStatus;
////////////////////////////////////////////////////////////////////////////////
void CAM_Sendsleep(void) //休眠
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x09;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x00;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
/////////////////////////////////////////////////////////////////////////////////
void CAM_Sendend(void) //发送结束
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x0E;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0xF0;
CAM_SendBuf[5]=0xF0;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
////////////////////////////////////////////////////////////////////////////////
void CAM_Sendanswer(void)//发送应答
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x0E;
CAM_SendBuf[2]=0x0D;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x00;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
////////////////////////////////////////////////////////////////////////////////
void CAM_SendNext(u16 count)//下一包
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x0E;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=(u8)(count&0xFF);
CAM_SendBuf[5]=(u8)((count>>8)&0xFF);
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
/////////////////////////////////////////////////////////////////////////////////
void CAM_Sendsys(void)//发送同步
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x0D;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x00;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
////////////////////////////////////////////////////////////////////////////////
void CAM_Sendinit(void)//初始化
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x01;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x07;
CAM_SendBuf[4]=0x05;
CAM_SendBuf[5]=0x05;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
/////////////////////////////////////////////////////////////////////////////////
void CAM_Sendbag(void)//包大小
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x06;
CAM_SendBuf[2]=0x08;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x02;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
////////////////////////////////////////////////////////////////////////////////
void CAM_Sendcap(void)//快照
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x05;
CAM_SendBuf[2]=0x00;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x00;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
/////////////////////////////////////////////////////////////////////////////////
void CAM_Sendget(void)//获取图像
{
CAM_SendBuf[0]=0xAA;
CAM_SendBuf[1]=0x04;
CAM_SendBuf[2]=0x01;
CAM_SendBuf[3]=0x00;
CAM_SendBuf[4]=0x00;
CAM_SendBuf[5]=0x00;
UART_DataSend(UART0,CAM_SendBuf,6);
Delay_NS(20);
}
/////////////////////////////////////////////////////////////////////////////////
void Clear_ReceiveBufA0(void)//清缓冲0
{
u8 i;
for(i=0;i<7;i++)
CAM_ReceiveBuf[i]=0;
}
/////////////////////////////////////////////////////////////////////////////////
void Clear_ReceiveBufA1(void)//清缓冲1
{
u8 i;
for(i=0;i<600;i++)
CAM_ReceiveBuf[i]=0;
}
////////////////////////////////////////////////////////////////////////////////
extern void ReceiveData()//Uart0中断数据处理
{
u8 bRByte;
u16 i=0,count=0;
UART_ByteReceive(UART0,(u8 *)&bRByte,0xFF);
CAM_ReceiveBuf[CAM_ReceiveLen]=bRByte;
CAM_ReceiveLen=0;
if((CAM_ReceiveBuf[0]==0xAA)&&(CAM_ReceiveBuf[1]==0x0D)&&(CAM_ReceiveBuf[5]==0x00))
CAM_Sendanswer();//摄像头发同步命令主机返回应答
if((CAM_ReceiveBuf[0]==0xAA)&&(CAM_ReceiveBuf[1]==0x0A)&&(CAM_ReceiveBuf[2]==0x01))
CAM_SendNext(0);//开始传输第一包影像命令
if((CAM_ReceiveBuf[0]==0x00)&&(CAM_ReceiveBuf[3]==0x02))//接收数据
{
++count;//计数器
UARTStatus=UART_ByteReceive(UART0,(u8 *)&CAM_ReceiveBuf,0xFF);
UART_ByteSend(UART1,(u8 *)&CAM_ReceiveBuf);
Delay_NS(18);
//收到的数据帧、运行和超时有错误
if(UARTStatus&(UART_FrameError|UART_OverrunError|UART_TimeOutIdle))
//错重新接收
UARTStatus=UART_ByteReceive(UART0,(u8 *)&CAM_ReceiveBuf,0xFF);
if(count==512)//等于512字节发下一包
{ //下一包
Clear_ReceiveBufA1();//清缓冲1
CAM_SendNext(++i);//发下一包
}
if(count!=512)//不等于512字节
{
Delay_NS(300);//等待中断是否接收数据
Clear_ReceiveBufA1();//清缓冲1
CAM_SendNext(++i);//发下一包
Delay_NS(300);//等待中断是否接收数据
CAM_Sendend();//结束
CAM_Sendsleep();//休眠
}
}
}
////////////////////////////////////////////////////////////////////////////////
u8 InitCamera(void)//初始化摄像头
{
u8 i;
Clear_ReceiveBufA0();//清缓冲0
for(i=0;i<60;i++)
{
CAM_Sendsys(); //同步命令
Delay_NS(168);
Clear_ReceiveBufA0();//清缓冲0
if(CAM_ReceiveBuf[2]==0x0D)
{ //判断是否是摄像头应答命令
break;
}
}
if(i==60)
return 1;
CAM_Sendinit();//发送初始化
Delay_NS(168);
if(CAM_ReceiveBuf[2]!=0x01)
return 1;
CAM_Sendbag();//包大小
Delay_NS(168);
if(CAM_ReceiveBuf[2]!=0x06)
return 1;
CAM_Sendcap();//快照
Delay_NS(168);
if(CAM_ReceiveBuf[2]!=0x05)
return 1;
CAM_Sendget();//获取图像
Delay_NS(168);
if(CAM_ReceiveBuf[2]!=0x04)
return 1;
return 0; //初始化成功
}
////////////////////////////////////////////////////////////////////////////////
extern void CompareCmd()//是不是想要的命令是发送图像数据
{
u8 i,bRet;
u8 CAM_Receive1[9];
u8 CAM_Receive2[9]={"%%CMD0L!!"};
UART_StringReceive(UART1,(u8 *)&CAM_Receive1);//接收计算机发来的命令
Delay_NS(168);
for(i=0;i<9;i++)
{
if(CAM_Receive1[i]!= CAM_Receive2[i]) //不相等
break;
else
if(CAM_Receive1[8]==CAM_Receive2[8]) //相等发送摄像头数据
{
bRet=InitCamera();
if(bRet==1) //摄像头初始化未成功
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -