在用STC的51模拟IIC读写RX8025,在读写过程中不能按指定寄存器来读写。无论指定的是哪个寄存器,读写寄存器都是从00H开始。
有空的朋友,可以帮忙看下么,先谢谢了.
具体如下:采用11.0592MHZ + 1T模式
unsigned char IIC_err;
sbit SDA = P1^7;
sbit SCL = P1^6;
#define R_TIME 0x64
#define S_SDA (SDA = 1)
#define S_SCL (SCL = 1)
#define C_SDA (SDA = 0)
#define C_SCL (SCL = 0)
/***********************************IIC 开始******************************/
void I2cDelay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************************************************/
//SCL'''''''''''''\____
//SDA'''''''\____
void Start(void)
{
S_SCL;
S_SDA;
I2cDelay();
C_SDA;
I2cDelay();
C_SCL; //产生下降沿
}
/***************************************************************************/
//SCL____/''''''''''''''
//SDA______/''''''''
void Stop(void)
{
C_SDA;
I2cDelay();
S_SCL;
I2cDelay();
S_SDA;//产生上升沿//结速
}
/***************************************************************************/
//SCL__/'1'''\__/''2''\__/''3''\__/''4''\__/''5''\__/''6''\__/''7''\__/''8''\__/''9''\__
//SDA_<M::::::><:::::::><:::::::><:::::::><:::::::><:::::::><:::::::><::::::L>\__ACK__从设备返回
unsigned char Write8Bit(unsigned char input)
{
unsigned char temp;
temp = 8;
while(temp--)
{
if(input&0x80)
{
S_SDA;
}
else
{
C_SDA;
}
I2cDelay();
S_SCL;
I2cDelay();
C_SCL;
input <<= 1;
}
S_SDA; //发送完1字节后释放总线
I2cDelay();
S_SCL;//上升沿检测信号
I2cDelay();
if(SDA)//检测ACK
{
C_SCL;
I2cDelay();
S_SDA;
return 1;
}
C_SCL;
I2cDelay();
S_SDA;
return 0;//有ACK
}
/***************************************************************************/
//SCL__/'1'''\__/''2''\__/''3''\__/''4''\__/''5''\__/''6''\__/''7''\__/''8''\__/''9''\__
//SDA_<M::::::><:::::::><:::::::><:::::::><:::::::><:::::::><:::::::><::::::L>\__ACK__->主设备返回
unsigned char Read8Bit(unsigned char Ack)
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
I2cDelay();
rbyte=rbyte<<1;
S_SCL;
I2cDelay();
if(SDA)rbyte++;//下降沿前读取数据
C_SCL;
}
if(Ack)//回应ACK
{
SDA = 0;
}
else
{
SDA = 1;
}
I2cDelay();
S_SCL;//第9个脉冲
I2cDelay();
C_SCL;
I2cDelay();
S_SDA;//释放总线
return(rbyte);
}
void WriteI2cPage(unsigned char DAdd,unsigned int add,unsigned char *str,unsigned char len)
{
IIC_err = 0;
Start();
IIC_err += Write8Bit(DAdd);
if(DAdd == E_PROM)
{
IIC_err += Write8Bit(add>>8);
}
IIC_err += Write8Bit(add);//写入地址
for(;len > 0;len--)
{
IIC_err += Write8Bit(*str);
str++;
}
Stop();
}
void ReadI2cPage(unsigned char DAdd,unsigned int add,unsigned char *str,unsigned char len)
{
IIC_err = 0;
Start();
IIC_err += Write8Bit(DAdd);
if(DAdd == E_PROM)
{
IIC_err += Write8Bit(add>>8);
}
IIC_err += Write8Bit(add);
Start();
IIC_err += Write8Bit(DAdd+1);
for(;len > 1;len--)
{
*str=Read8Bit(1);
str++;
}
*str = Read8Bit(0);
Stop();
}
/*IIC 结束*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>