首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

用PCF8591做AD/DA实验时,一个关于I2C总线的有关问题

2012-09-13 
用PCF8591做AD/DA实验时,一个关于I2C总线的问题对的代码:C/C++ codeuchar ADConvert(uchar adchannel){//A

用PCF8591做AD/DA实验时,一个关于I2C总线的问题
对的代码:

C/C++ code
uchar ADConvert(uchar adchannel){//AD转换,里面用的子函数都是24系列的I2C总线软件包里的,没有问题uchar temp;Start_I2c();SendByte(0x90);if(ack==0) return(0);switch(adchannel){    case 0:SendByte(0x41);break;    case 1:SendByte(0x42);break;}if(ack==0) return(0);Stop_I2c();//总线结束Start_I2c();//总线开始SendByte(0x91);if(ack==0) return(0);temp=RcvByte();Ack_I2c(1);Stop_I2c();return(temp);}

我一开始时是没有中间这两句的
C/C++ code
Stop_I2c();//总线结束Start_I2c();//总线开始

结果就是得到的AIN0(0X40)和AIN1(0X41)两线模拟输入值都是0xFF。I2C总线是支持一次传输多字节的嘛?!应该也不是两个SendByte()延时不足。。。到底是怎么回事??


[解决办法]
你这个是读取某个从设备偏移地址的寄存器函数吧,如果你仔细看I2C文档,你会发现读取一个byte序列是这样的
start, dev_address(write), ack, data(register offset), repeated_start, dev_address(read), ack, data(register_value), ack,stop
看出区别了么,你应该把当中的Stop_I2c(),Start_I2c()替换成相应的repreated start函数.

至于多个byte,可以通过重复上述过程来完成,也有别的格式,这个要看你读取的那个设备的数据手册是怎么定义的.
[解决办法]
Q1,不是,是有数据传输率的,100Khz/400khz.数据阶段一直为低的话,表示一直传0.直到结束.
Q2,建议你不要光看代码,你说的这些I2C协议有明确规定,每个阶段的信号需要拉高拉低说得很清楚,对着协议看代码会很清楚.

热点排行