VK3366的IIC通信.docx
《VK3366的IIC通信.docx》由会员分享,可在线阅读,更多相关《VK3366的IIC通信.docx(17页珍藏版)》请在冰豆网上搜索。
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通信的时候,必须在紧跟地址字节后发送寄存器地址。
这个寄存器地址是主机想在一个字节读写或者多字节读写的操作的内部地址字。
这个寄存器地址字是8比特字节。
与其它设备不同它没有方向位,与普通的数据字节相同,它必须跟一个应答位。
一个写寄存器的操作如下图所示。
起始位后面紧跟从机地址和一个读写的方向位,一个寄存器地址字节,一系列的数据字节和一个停止位。
寄存器地址指示主机想操作的寄存器。
紧跟着的数据会被写入指定的寄存器。
一个寄存器的读操作与写操作类似。
主机发送从机地址和读的方向信号,紧跟寄存器地址,这时VK3366就会发送数据给主机。
[注意]:
白的部分是主机到VK3366,灰色的部分是VK3366到主机
[注意]:
白的部分是主机到VK3366,灰色的部分是VK3366到主机
从上面的通信格式我们可以看出,在一次通信的过程中包含如下几个部分:
A、起始位和停止位
B、应答位
C、器件地址
D、寄存器地址
E、数据段
1)起始位和停止位
起始位和停止位的格式
2)应答位
3)器件地址
A1
A0
VK3366IIC地址
0
0
0x90(1001000X)
0
1
0x92(1001001X)
1
0
0x94(1001010X)
1
1
0x96(1001011X)
[注意]:
X=‘0’表示写周期
X=‘1’表示读周期
注意:
器件地址是由A1A0编程实现的。
而且最低位是读写控制位。
例如当A1A0=11时,向器件写数据时的器件地址为0x96,从器件中读数据时的器件地址为0x97.
4)寄存器地址
Bit
值
功能
7
---
保留
6
0
读/写寄存器
5--4
C[1:
0]
通道号码
3--0
A[3:
0]
寄存器地址
5)一些关键函数
//*************************************************************************
//Function:
主串口读写函数
//输入:
data1是写vk3366的器件地址,data2是vk3366的寄存器地址,data3是发送的数据
//输出:
i,读取数据
//日期:
2012/3/27
//********************************************************************unsignedcharsend(unsignedchar_data1,unsignedchar_data2,unsignedchar_data3)
{
unsignedchari;
clk=1;//start
delay
(1);
sda=0;
delay
(1);
clk=0;
delay
(1);
i=0;
if(_data1&0x80)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x40)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x20)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x10)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x08)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x04)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&0x02)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data1&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(_data2&0x80)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x40)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x20)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x10)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x08)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x04)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x02)
{
sda=1;
}
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data2&0x01)
sda=1;
elsesda=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;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x40)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x20)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x10)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x08)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x04)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x02)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
if(_data3&0x01)
sda=1;
elsesda=0;
delay
(1);
clk=1;
delay
(1);
clk=0;
delay
(1);
clk=1;//ack
delay
(1);
clk=0;
delay
(1);
sda=0;//stopbit
delay
(1);
clk=1;
delay
(1);
sda=1;
}
else
{
clk=1;
delay
(1);
if(sda)
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)
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;//stopbit
delay
(1);
clk=1;
delay
(1);
sda=1;
}
returni;
}
//*************************************************************************
//*************************************************************************
//Function:
写寄存器函数
//输入:
port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据
//输出:
无
//日期:
2012/3/27
//********************************************************************
voidwrite_reg(unsignedcharport,unsignedcharreg,unsignedchardat)
{
send(0x96,(((port-1)<<4)+reg),dat);//0x96为器件地址,由A1AO编程和写控制决定
}
//*************************************************************************
//Function:
读寄存器函数
//输入:
port为子串口的路数,reg为寄存器的地址
//输出:
返回值
//日期:
2012/3/27
//*************************************************************************
unsignedcharread_reg(unsignedcharport,unsignedcharreg)
{
returnsend(0x97,(((port-1)<<4)+reg),0x00);//0x97为器件地址,由A1AO编程和读控制决定
}