android i2c可以连24c02吗,求助:为什么我的I2C程序读写PCF8563正常,但用来写24C02就是不成功??...

我的24C02和PCF8563挂在同一条51单片机模拟出来的I2C总线上,SDA和SCL也使用了外接上拉电阻(5K6).单片机可以正常读写PCF8563,但就是不能写24C02..但貌似可以读24C02,问题出在哪里啊???请高手指点下...

24C02的A2-A0接地,WP也接地了...器件地址使用0xa0(写),0xa1(读),文件包含PCF8563.H,而I2C.H文件包含在PCF8563中

与24C02相关的函数如下:

#include

/******************************************************

功能:写24C02一个数据

参数:存储地址(0-255),待写入的数据字节

*******************************************************/

void Write24c02_Byte(unsigned char addr,unsigned char wdata)

{

Start();                                        //启动I2C总线

WriteByte(ADDR_EP_W);                //24C02写地址

WriteByte(addr);                         //存放地址

WriteByte(wdata);                        //数据

Stop();                                                //关闭I2C总线

}

/*******************************************************

功能:读24C02一个字节数据

参数:存储器地址(0-255)

*******************************************************/

unsigned char Read24c02_Byte(unsigned char addr)

{

unsigned char temp;

Start();

WriteByte(ADDR_EP_W);                //发送24C02写地址

WriteByte(addr);                           //待读取内容所在的地址

Start();                                        //启动I2C总线

WriteByte(ADDR_EP_R);           //发送24C02读地址

temp = ReadByte();                         //读字节

WriteACK(1);                                //发送非应答位

Stop();                                                //关闭I2C总线

return temp;                                   //返回数据字节

}

==========pcf8563.h中包括i2c.h文件=============================================

#include "I2C.H"

(.....略)

==============================

=================I2C.H===================

#include

#include

/*定义端口线*/

sbit SDA=P1^4;

sbit SCL=P1^3;

/********************************************

内部函数,延时1

功能:根据单片机的晶振频率制定延时时间

********************************************/

void DD()

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

/********************************************

内部函数,I2C开始

********************************************/

void Start()

{

EA=0;

SDA=1;

SCL=1;

DD();

SDA=0;

DD();

SCL=0;

}

/********************************************

内部函数,I2C结束

********************************************/

void Stop()

{

SDA=0;

SCL=0;

DD();

SCL=1;

DD();

SDA=1;

DD();

EA=1;

}

/********************************************

内部函数,输出ACK.每个字节传输完成,输出ack=0,结束读数据,ack=1;

********************************************/

void WriteACK(unsigned char ack)

{

SDA=ack;

DD();

SCL=1;

DD();

SCL=0;

}

/********************************************

功能:发送非应答位

内部函数,输出NoACK.

********************************************/

void WriteNoACK()

{

SCL = 0;

_nop_();

SDA = 1;

_nop_();

SCL = 1;

_nop_();

SCL = 0;

}

/********************************************

内部函数,等待ACK

********************************************/

void WaitACK()

{

unsigned char errtime=20;

SDA=1;                                                //SDA线置输入状态

DD();                                                 //读ACK

SCL=1;

DD();

while(SDA)

{

errtime--;

if(!errtime) Stop();

}

SCL=0;

DD();

}

/****************************************************************

功能:应答I2C总线检查  *

参数:无               *

返回:1 有ACK信号 0 无ACK信号                        *

****************************************************************/

bit CheckAck()                                //

{

bit ack_flag;

SDA=1;                        //置输入状态

DD();

SCL=1;

DD();

if(SDA==0)

{

ack_flag=1;

}

else

{

ack_flag=0;

}

SCL=0;

return        ack_flag;

}

/********************************************

内部函数.输出数据字节

入口:B=数据

********************************************/

void WriteByte(unsigned char wdata)

{

unsigned char i;

for(i=0;i<8;i++)

{

if(wdata&0x80) SDA=1;

else SDA=0;

wdata<<=1;

SCL=1;

DD();

SCL=0;

}

WaitACK();                         //I2C器件或通讯出错,将会退出I2C通讯

}

/********************************************

内部函数.输入数据

出口:B

********************************************/

unsigned char ReadByte()

{

unsigned char i,bytedata;

SDA=1;

for(i=0;i<8;i++)

{

SCL=1;

bytedata<<=1;

bytedata|=SDA;

SCL=0;

DD();

}

return(bytedata);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I2C接口RTC实时时钟pcf8563读写Verilog驱动源码Quartus工程文件,FPGA型号Cyclone4E系列中的EP4CE10F17C8,Quartus版本18.0。 module rtc( //system clock input sys_clk , // 系统时钟 input sys_rst_n , // 系统复位 //pcf8563 interface output rtc_scl , // i2c时钟线 inout rtc_sda , // i2c数据线 //user interface input key2 , // 开关按键 output [5:0] sel , // 数码管位选 output [7:0] seg_led // 数码管段选 ); //parameter define parameter SLAVE_ADDR = 7'h51 ; // 器件地址 parameter BIT_CTRL = 1'b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ = 26'd50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FREQ = 18'd250_000 ; // I2C的SCL时钟频率 parameter POINT = 6'b010100 ; // 控制点亮数码管小数点的位置 //初始时间设置,从高到低为年到秒,各占8bit parameter TIME_INI = 48'h18_05_23_09_30_00; //wire define wire clk ; // I2C操作时钟 wire i2c_exec ; // i2c触发控制 wire [15:0] i2c_addr ; // i2c操作地址 wire [ 7:0] i2c_data_w; // i2c入的数据 wire i2c_done ; // i2c操作结束标志 wire i2c_ack ; // I2C应答标志 0:应答 1:未应答 wire i2c_rh_wl ; // i2c读写控制 wire [ 7:0] i2c_data_r; // i2c读出的数据 wire [23:0] num ; // 数码管要显示的数据 wire key_value ; // 按键消抖后的数据 //***************************************************** //** main code //***************************************************** //例化i2c_dri,调用IIC协议 i2c_dri #( .SLAVE_ADDR (SLAVE_ADDR), // slave address从机地址,放此处方便参数传递 .CLK_FREQ (CLK_FREQ ), // i2c_dri模块的驱动时钟频率(CLK_FREQ) .I2C_FREQ (I2C_FREQ ) // I2C的SCL时钟频率 ) u_i2c_dri( //global clock .clk (sys_clk ), // i2c_dri模块的驱动时钟(CLK_F

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值