VK3366的IIC通信.docx

上传人:b****7 文档编号:10634816 上传时间:2023-02-22 格式:DOCX 页数:17 大小:66.78KB
下载 相关 举报
VK3366的IIC通信.docx_第1页
第1页 / 共17页
VK3366的IIC通信.docx_第2页
第2页 / 共17页
VK3366的IIC通信.docx_第3页
第3页 / 共17页
VK3366的IIC通信.docx_第4页
第4页 / 共17页
VK3366的IIC通信.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VK3366的IIC通信.docx

《VK3366的IIC通信.docx》由会员分享,可在线阅读,更多相关《VK3366的IIC通信.docx(17页珍藏版)》请在冰豆网上搜索。

VK3366的IIC通信.docx

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编程和读控制决定

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1