软件读写K24C02,怎么读出来一直是00
//-----------------------------------------------------------
#include "mylib.h"
#include <SH79F082.H>
#include <intrins.h>
//-----------------------常量定义-------------------------------
#define sda P0_4
#define scl P0_5
//-----------------------------变量定义--------------------------
bit f_ACK;
bit f_I2C_rede_on;
bit f_I2C_write_on;
//--------------------------------------------------------------
INT8U b_i2i_buf; //数据临时值
INT8U temp; //读写的次数
INT8U b_error_sum; //错误的次数
INT8U RF_value1=0x80; //
INT8U RF_value2=0x70; //
INT8U b_i2i_value1;
INT8U b_i2i_value2;
//---------------延时函数---------------------------------------
//**************************************;1us的基准时间----------
void delay_us(INT16U i)
{
for(;i>0;i--)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void init(void)
{
CLKCON = 0X00;
P0CR|=0XFF; //输出状态0005000
// P0CR|=0X20; //输出状态0050000
sda=1;
scl=1;
ADCH = 0x00;
}
//-------------------------发起起始位------------------------
void start_i2i(void)
{
P0CR|=0X10; //输出状态0005000
P0CR|=0X20; //输出状态0050000
sda=1;
scl=1;
delay_us(10);
sda=0;
delay_us(10);
scl=0;
}
//----------------------------发送停止信号------------------
void stop_i2i(void)
{
sda=0;
scl=1;
delay_us(10);
sda=1;
}
//-----------------检查应答信号,没有应答信号f_ACK=0------------
void check_ack(void)
{
//sdam=0; //置 SDA 为输入模式
P0CR&=0XEF;
scl=1; //钳着总线,等待应答
f_ACK=1;
if(sda==1) {f_ACK=0;} //无应答信号
scl=0; //释放总线,准备收发数据
// sdam=1; //使 SDA 线输出
P0CR|=0X10;
}
//--------------------------发送应答位子程序------------------------
void ask_i2c(void)
{
sda=0; //sda=0,应答信号
scl=1; //钳着总线sda,稳定数据
delay_us(10);
scl=0; //释放总线
}
//--------------------功能:发无确认信号----------------------------
void nask_i2c(void )
{
sda=1; // sda=1,非应答信号
scl=1; //钳着总线sda,稳定数据
delay_us(10);
scl=0; //释放总线
}
//------------------功能:向 I2IC 器件里写入 1 字节----------------
void write_8bit(void)
{
for(temp=0;temp<8;temp++)
{
// b_i2i_buf=b_i2i_buf<<=1; //取将要写的数据位
b_i2i_buf<<=1;
if(sda==1) {sda=1;} //fc
else {sda=0;}
scl=1; //钳着总线,数据稳定
delay_us(10);
scl=0; //释放总线
}
}
//-----------------功能:从 I2IC 器件里读取 1 字节--------------------
void read_8bit(void )
{
P0CR&= 0XEF; //使SDA线输入
delay_us(10);
for(temp=0;temp<8;temp++)
{
scl=1; //时钟线为高,接受数据位
delay_us(10);
sda=1; //假设sda=1
if(sda==0){sda=0;} //
//b_i2i_buf=b_i2i_buf<<=1;
b_i2i_buf<<=1; //
scl=0;
}
P0CR|=0X10; //使SDA线输出
}
//---------------------------------写--------------------------
void I2C_write(void)
{
b_error_sum = 4; //允许错误4次
//..............................................................
write_pro5:
start_i2i(); //启动起始信号
b_i2i_buf=0xa0;
write_8bit(); //发出写24C02的寻址字节55 000 0,即0A0H
check_ack(); //读应答信号
if(f_ACK==0) {goto write_pro80;} //是否有应答信号
//..............................................................
b_i2i_buf=0; //发数据写入24C02的地址,本例中为00h
write_8bit();
check_ack();
if(f_ACK==0) {goto write_pro80;}
//*******************************************************************
b_i2i_buf=RF_value1; //往24C02中写入数据
write_8bit();
check_ack();
if(f_ACK==0) {goto write_pro80;}
//.....................................................................
// b_i2i_buf=RF_value2; //往24C02中写入数据
// write_8bit();
// check_ack();
// if(f_ACK==0) {goto write_pro80;}
//......................................................................
stop_i2i(); //停止发送
f_I2C_write_on=0; //采集成功
//********************************************************************
write_pro80:
b_error_sum--;
if(b_error_sum!=0){goto write_pro5;}
}
//--------------------------------------------------------------------
//---------------------------------读操作-----------------------------
//--------------------------------------------------------------------
void I2C_read(void)
{
b_error_sum=4;
//...............................................................
read_pro5:
//..............................................................
start_i2i(); //启动起始信号
b_i2i_buf=0xa0; //发写24C02的寻址字节55 000 0
write_8bit();
check_ack();
if(f_ACK==0) {goto read_pro80;} //看 f_ACK 是否为 1,为1则有应答信号
b_i2i_buf=0; //发要读取的数据在24C02中的地址,即00h
write_8bit();
check_ack();
if(f_ACK==0) {goto read_pro80;}
//........................................................
start_i2i();
b_i2i_buf=0xa1; //发读24C02的寻址字节55 000 (1--读)
write_8bit();
check_ack();
if(f_ACK==0) {goto read_pro80;}
//***********************************************************
read_8bit(); //读数据
ask_i2c();
b_i2i_value1=b_i2i_buf; //读数据
//...........................................................
// read_8bit();
// nask_i2c(); //最后是无应答信号
// b_i2i_value2=b_i2i_buf; //读数据
//............................................................
stop_i2i(); //停止信号
f_I2C_rede_on=1; //读I2C成功
//************************************************************
read_pro80:
b_error_sum--;
if(b_error_sum!=0){goto read_pro5;}
//..............................................................
}
void main(void)
{
while(1)
{
delay_us(1);
init();
I2C_write();
delay_us(250);
I2C_read();
while(1);
}
}
//**********END****************************************************/
b_i2i_value1的值怎么来是0X00,不知道那里有错误? 晶震用8M. |