首先分析一下IMX222这颗图像CMOS
这颗芯片可以支持单字节写,读写指令可以单字节读也可以多字节读。
可以设置1080P格式
注意这里涉及到了高低位变化的处理
因为SPI 发送数据时,是高位在最前面,低位在最后面,所以这里需要涉及到高低位的转换。因为cmos芯片是低位在最高位。
比如0x02的发送,就变成了0100 0000了
u8 spi_wreg[REG_NUM][REG_BYTE]={
{ 0x02, 0x00, 0x31 }, //standby
{ 0x02, 0x01,0x01}, // vs reverse
{ 0X02, 0x02, 0xF }, //1080p
{ 0X02, 0x03, 0x4c }, //2
{ 0X02, 0x04, 0x04 }, //3
{ 0X02, 0x05, 0x65 }, //4
{ 0X02, 0x06, 0x04 }, //5
{ 0X02, 0x11, 0x00 },//6
{ 0X02, 0x12, 0x82 }, //7
{ 0X02, 0x14, 0x00 }, //8
{ 0X02, 0x15, 0x00 }, //9
{ 0X02, 0x16, 0x3C }, //10
{ 0X02, 0x17, 0x00 }, //11
{ 0X02, 0x18, 0xC0 }, //12
{ 0X02, 0x19, 0x07 }, //13
{ 0X02, 0x1A, 0x51 }, //14
{ 0X02, 0x1B, 0x04 }, //15
{ 0X02, 0x1e, 0x20 }, //gain
{ 0X02, 0x20, 0xf0 }, //16
{ 0X02, 0x21, 0x00 }, //16
{ 0X02, 0x2c, 0x00 }, //16
{ 0X02, 0x2d, 0x42 }, //clk
{ 0X02, 0x3b, 0xe1 }, //18 sync code
{ 0X02, 0x9A, 0x26 }, //22
{ 0X02, 0x9B, 0x02 }, //23
{ 0X02, 0xCE, 0x16 }, //24
{ 0X02, 0xCF, 0x82 }, //25
{ 0X02, 0xD0, 0x00 }, //26
{ 0X02, 0x00, 0x00 }, //27
};
配置列表如图所示:可以考虑使用二维数组的方式进行初始化。
比如:写一个for循环进行初始化
int initIMX222(XSpiPs *spipsptr){
int i;
int status;
for(i=0;i<REG_NUM;i++){
spi_wreg[i][0]=msb2lsb(spi_wreg[i][0]);
spi_wreg[i][1]=msb2lsb(spi_wreg[i][1]);
spi_wreg[i][2]=msb2lsb(spi_wreg[i][2]);
}
for(i=0;i<REG_NUM;i++){
status = XSpiPs_PolledTransfer(spipsptr,spi_wreg[i],NULL,REG_BYTE);
if(status != XST_SUCCESS){
return status;
}
}
return status;
}
其中 msb2lsb 是高低位转换的函数
u8 msb2lsb(u8 data){
u8 tmp=0;
int i;
for(i=0;i<8;i++){
if((data&0x01)==0x01){
tmp = tmp | (0x01<<(7-i));
}
data=data>>1;
}
return tmp;
};
解释一下这个函数作用,首先data为8bit 然后进入for循环,判断最低位与上0x01,如果低位为1的话,把1左移7-i位,之后data右移1位,这样反复循环进行操作
GPIO初始化,可以参考GPIO的例子。有两个可以参考的
参考xgpiops_polled_example的例子
static int GpioOutputExample(void);
static int GpioInputExample(u32 *DataRead);
int GpioPolledExample(u16 DeviceId, u32 *DataRead);
一般要配置GPIO的话,需要设置GPIO输出方向,然后在使能输出,最后在设置GPIO的输出。
然后这里涉及到了GPIO BANK的使用,bank 0 和 bank 1为MIO ,bank2 和 bank 3为EMIO,
bank 0 有32个pin ,bank 1有22个pin ,所以要使用emio的话,是从54号引脚开始的。这样就理解了怎么使用MIO 以及EMIO