请各位大师帮我解答解答,下面几个问题想了几天也没想明白,先谢了!!
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0; //这里只要将他拉低就可以了,然后就进入数据发送
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
¶áèëò»¸ö×Ö½ú2¢·μ»Ø
------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0; // 这里将SCL拉低后,接着又拉高了,为什么和上面写时时序不同?应该一样的啊
_nop_();
Scl=1; //
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
}
还有这下面
/////////////////////////////////////////////////////////////////////////////////////////
/*------------------------------------------------
写入DA数模转换值
------------------------------------------------*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //这里是写入芯片地址,但为什么AddWr的地址要等于0x90呢?
Ack();
Send(0x40); //这里是发送的芯片内部地址吗?也就是8591的内部地址吗?
Ack();
Send(Data); //写数据
Ack();
Stop();
}
/*------------------------------------------------
读取AD模数转换的值,有返回值
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start();
Send(AddWr); //写入芯片地址
Ack();
Send(0x40|Chl);//写入选择的通道,Chl的值分别为0、1、2、3,分别代表1-4通道。不明白为什么这里
//是怎么做到通道选择的,还有0x40什么意思? 和chl相或就是在选择通道吗?
Ack();
Start();
Send(AddRd); //读入地址
Ack();
Data=Read(); //读数据
Scl=0;
NoAck();
Stop();
return Data; //返回值
}
你可以看下IIC写数据和读数据时的时序,另外你需要参考外设芯片手册来查看你需要写入的数据,有些是固定的数据,有些是需要变化的数据
读写的时序本身就不一样。看看i2c的时序,另外, i2c从设备的手册也应该有时序说明。以手册时序为标准,就可以了。不管程序的语句是怎么样的,时序一定要按照手册时序来做。你可以运行一下,看看时序对不对。