连接及端口说明
AO:模拟输出控制端口(接单片机IO口)
SI:CCD数据传输端口(接ADC通道,一组数据共128位,对应128个像素点)
CLK:时钟脉冲端口(接单片机IO口)
时序图
时序图解读:
CLK信号为低电平时,将SI置为高电平并保持到CLK信号跳变为高电平,此时将SI置为低电平,AO端口开始向单片机ADC传输模拟信号,每个模拟信号保持一个CLK单位(即CLK由高电平跳变为低电平再跳变为高电平,建议在低电平时采集信号),共传输128个模拟信号。
蓝宙驱动程序解读
/*
端口对应说明
pin27 = SI
pin29 = CLK
pin0 = AO
*/
void CAMERA(void)
{
TranamitData("Line Senaor Test\n\r"); //上位机显示信息
SIV.PCR[27].R = 0x0200; //初始化pin27为输出端口
SIV.PCR[29].R = 0x0200; //初始化pin29为输出端口
for(j=0;j<2;j++) //循环2次,即采集两组CCD数据
{
/*采集前设置开始*/
SIV.PCR[27].R = 0x0200; //设置pin27(SI)为输出端口
SIV.PCR[29].R = 0x0200; //设置pin29(CLK)为输出端口
SIV.PGPDO[0].R &= ~0x00000014; //设置所有端口为低电平
SIV.PGPDO[0].R |= 0x00000010; //设置SI为高电平
Delay(); //延时一会
SIV.PGPDO[0].R |= 0x00000004; //设置CLK为高电平
Delay(); //延时一会
SIV.PGPDO[0].R &= ~0x00000010; //设置SI为低电平
Delay(); //延时一会
SIV.PGPDO[0].R &= ~0x00000004; //设置CLK低电平
Delay();
/*采集前设置结束*/
/*CCD像素模拟数据采集开始*/
for (i=0;i<128;i++) //循环128次,即采集1128个像素点模拟数据
{
Delay(); //延时一会
SIV.PGPDO[0].R |= 0x00000004; //设置CLK为高电平
ADC.MCR.B.NSTART = 1; //ADC开始采集模拟数据
while(ADC.MCR.B.NSTART == 1); //等待ADC采集完成
adcdata = ADC.CDR[0].B.CDATA; //将转换成的数字信号存储到adcdata
Dealy(); //延时一会
SIV.PGPDO[0].R &= ~0x00000004; //设置CLK为低电平
Resulit[1] = (uint8_t)(adcdata >> 2); //数据去掉低位两位,转换为8位整型存储至数组
}
Delaycamera(); //完成一位像素采集,CCD延时一会
/*CCD像素模拟数据采集结束*/
}
printlistall(); //输出数据到上位机
}
注:程序未验证