1、VK3366的IIC通信 VK3366的IIC通信1、vk3366的IIC通信时的模式选择。我们芯片的IIC通信并不是标准的IIC通信模式,而是模拟的iic通信模式,请注意我们的通信时序。 通过MS0和MS1是模式选择位来选择VK3366主串口的接入模式,当MS1引脚接高电平,MS0引脚接低电平时,VK3366芯片主口是IIC模式。2、SDA,SCL引脚 1)SDA是串行数据总线,SCL是串行时钟总线。当总线空闲时,SDA和SCL都通过上拉电阻接到电源正。3、传输协议 当主机与VK3366通信的时候,必须在紧跟地址字节后发送寄存器地址。这个寄存器地址是主机想在一个字节读写或者多字节读写的操作的
2、内部地址字。这个寄存器地址字是8比特字节。与其它设备不同它没有方向位,与普通的数据字节相同,它必须跟一个应答位。一个写寄存器的操作如下图所示。起始位后面紧跟从机地址和一个读写的方向位,一个寄存器地址字节,一系列的数据字节和一个停止位。寄存器地址指示主机想操作的寄存器。紧跟着的数据会被写入指定的寄存器。一个寄存器的读操作与写操作类似。主机发送从机地址和读的方向信号,紧跟寄存器地址,这时VK3366就会发送数据给主机。注意:白的部分是主机到VK3366,灰色的部分是VK3366到主机注意:白的部分是主机到VK3366,灰色的部分是VK3366到主机 从上面的通信格式我们可以看出,在一次通信的过程中
3、包含如下几个部分: A、起始位和停止位 B、应答位 C、器件地址 D、寄存器地址 E、数据段 1)起始位和停止位起始位和停止位的格式 2)应答位 3)器件地址 A1A0VK3366 IIC 地址000x90(1001 000X)010x92(1001 001X)100x94(1001 010X)110x96(1001 011X)注意: X = 0 表示写周期 X = 1 表示读周期注意:器件地址是由A1A0编程实现的。而且最低位是读写控制位。例如当A1A0=11时,向器件写数据时的器件地址为0x96,从器件中读数据时的器件地址为0x97.4)寄存器地址Bit值功能7-保留60读/写寄存器5-4
4、C1:0通道号码3-0A3:0寄存器地址5)一些关键函数/*/Function:主串口读写函数/输入:data1是写vk3366的器件地址,data2是vk3366的寄存器地址,data3是发送的数据/输出: i,读取数据/日期:2012/3/27/* unsigned char send(unsigned char _data1,unsigned char _data2,unsigned char _data3) unsigned char i; clk=1; / start delay(1); sda=0; delay(1); clk=0; delay(1); i=0; if(_data1
5、&0x80) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x40) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x20) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x10) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; del
6、ay(1); if(_data1&0x08) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x04) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x02) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data1&0x01) sda=1; else sda=0; delay(1); clk=1; dela
7、y(1); clk=0; delay(1); clk=1; /ack delay(1); clk=0; delay(1); if(_data2&0x80) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data2&0x40) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data2&0x20) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); i
8、f(_data2&0x10) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data2&0x08) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data2&0x04) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data2&0x02) sda=1; else sda=0; delay(1); clk=1; delay(1); cl
9、k=0; delay(1); if(_data2&0x01) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); clk=1; /ack delay(1); clk=0; delay(1); if(!(_data1&0x01) if(_data3&0x80) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data3&0x40) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; d
10、elay(1); if(_data3&0x20) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data3&0x10) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data3&0x08) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data3&0x04) sda=1; else sda=0; delay(1); clk=1; de
11、lay(1); clk=0; delay(1); if(_data3&0x02) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); if(_data3&0x01) sda=1; else sda=0; delay(1); clk=1; delay(1); clk=0; delay(1); clk=1; /ack delay(1); clk=0; delay(1); sda=0;/stop bit delay(1); clk=1; delay(1); sda=1; else clk=1; delay(1); if(sda
12、) i=i+128; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+64; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+32; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+16; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+8; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+4; clk=0; delay(1); clk=1; delay(1); if(sda)
13、 i=i+2; clk=0; delay(1); clk=1; delay(1); if(sda) i=i+1; clk=0; delay(1); sda=0; delay(1); clk=1; /ack delay(1); clk=0; delay(1); sda=0;/stop bit delay(1); clk=1; delay(1); sda=1; return i;/*/*/Function:写寄存器函数/输入:port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据/输出: 无/日期:2012/3/27/*void write_reg(unsigned char port,unsigned char reg,unsigned char dat) send(0x96,(port-1)4)+reg),dat); /0x96为器件地址,由A1AO编程和写控制决定/*/Function:读寄存器函数/输入:port为子串口的路数,reg为寄存器的地址/输出: 返回值/日期:2012/3/27/*unsigned char read_reg(unsigned char port,unsigned char reg) return send(0x97,(port-1)4)+reg),0x00);/0x97为器件地址,由A1AO编程和读控制决定
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1