使用iic模块读写24c256,有的时候24c256无应答,怎么回事 初学单片机,请大家帮帮忙

使用iic模块读写24c256,有的时候24c256无应答,怎么回事 初学单片机,请大家帮帮忙,第1张

你发的时序和命令正确么?

start+器件地址+读写位:start信号和数据的建立时间、保持时间是否符合那个24c256的规格;器件地址是否为1010+(A2A1A0:24c256的管脚状态)。

另外就是硬件链接是否正确。

我也碰到相同的问题,现已解决。

问题是出 restart的时序上。

SCL为低时,拉高SDA,

SCL再拉高,

SDA拉低,

SCL拉低。

看是否能帮到你。

你的程序编译是通过的,看你的原理图,指出两点:

1你的地址端接的是高电平,读写时是不是和0xae,0xaf地址码对应,请请查看使用说明解决。

2SCL、SDA需要接上上电阻的,不然高电平上不去。

希望对你有帮助!

什么是单个数据?IIC总线就是把所需的数据经sda数据线串行传入芯片中,需要多少传多少就是 了,我这有个以前写的IIC控制WM8731的例程,你可以参考下

//`timescale 1ns / 1ps

module i2c_control(

clk,

i2c_sclk,

i2c_sdat,

i2c_data,

start,

tr_end,

ack,

rst,

counter,

sdo);

input clk;

input [23:0]i2c_data;

input start;

input rst;

// input w_r;

inout i2c_sdat;

output i2c_sclk;

output tr_end;

output ack;

output [5:0]counter;

output sdo;

reg sdo;

reg sclk;

reg tr_end;

reg [23:0]sd;

reg [5:0]counter;

assign i2c_sclk=sclk |(((counter>=4)&(counter<=30))~clk:0);

assign i2c_sdat=sdo1'bz:0;

reg ack1,ack2,ack3;

wire ack=ack1 |ack2 |ack3;

always@(negedge rst or posedge clk)begin

if(!rst)counter<=6'b111111;

else begin

if(start==0)

counter<=0;

else

if(counter<6'b111111)counter<=counter+1;

end

end

always@(negedge rst or posedge clk)begin

if(!rst)begin sclk<=1;sdo<=1;ack1<=0;ack2<=0;ack3<=0;tr_end<=0;end

else

case(counter)

6'd0 :begin ack1<=0;ack2<=0;ack3<=0;tr_end<=0;sdo<=1;sclk<=1;end

6'd1 :begin sd<=i2c_data;sdo<=0;end

6'd2 :sclk=0;

6'd3 :sdo<=sd[23];

6'd4 :sdo<=sd[22];

6'd5 :sdo<=sd[21];

6'd6 :sdo<=sd[20];

6'd7 :sdo<=sd[19];

6'd8 :sdo<=sd[18];

6'd9 :sdo<=sd[17];

6'd10 :sdo<=sd[16];

6'd11 :sdo<=1'b1;

6'd12 :begin sdo<=sd[15];ack1<=i2c_sdat;end

6'd13 :sdo<=sd[14];

6'd14 :sdo<=sd[13];

6'd15 :sdo<=sd[12];

6'd16 :sdo<=sd[11];

6'd17 :sdo<=sd[10];

6'd18 :sdo<=sd[9];

6'd19 :sdo<=sd[8];

6'd20 :sdo<=1'b1;

6'd21 :begin sdo<=sd[7];ack2<=i2c_sdat;end

6'd22 :sdo<=sd[6];

6'd23 :sdo<=sd[5];

6'd24 :sdo<=sd[4];

6'd25 :sdo<=sd[3];

6'd26 :sdo<=sd[2];

6'd27 :sdo<=sd[1];

6'd28 :sdo<=sd[0];

6'd29 :sdo<=1'b1;

6'd30 :begin sdo<=1'b0;sclk<=1'b0;ack3<=i2c_sdat;end

6'd31 :sclk<=1'b1;

6'd32 :begin sdo<=1'b1;tr_end<=1;end

endcase

end

endmodule

你这个单片机是带I2C接口的

那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442

你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去

我给你一个模拟的看看

#include<reg51h>

#include <Intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit pcf8563_scl=P0^5;//时钟频率

sbit pcf8563_sda=P0^4;//串行数据传输脚

bit busy=0;

uchar sg;//时高位

uchar sd;//时低位

uchar fg;//分高位

uchar fd;//分低位

uchar mg;//秒高位

uchar md;//秒低位

uchar hou=0;

uchar min=0;

uchar sec=0;

uchar subadd;//地址

uchar dat;//数据

uchar number;

void start_pcf8563();//开始数据

void send_pcf8563_byte();//发送

void stop_pcf8563();//结束数据

void receive_pcf8563_byte();//接收

void spit_time();//分别计算时、分、秒的各位数字

void spit_time()//分别计算时、分、秒的各位数字

{

sg=(int)hou/10;

sd=(int)hou%10;

fg=(int)min/10;

fd=(int)min%10;

mg=(int)sec/10;

md=(int)sec%10;

}

void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节

{

uchar aa;

pcf8563_scl=0;

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

{

if((bb&0x80)==0x80)

{

pcf8563_sda=1;

}

else

{

pcf8563_sda=0;

}

pcf8563_scl=1;

pcf8563_scl=0;

bb=bb<<1;

}

_nop_();

_nop_();

pcf8563_sda=1;

pcf8563_scl=1;

busy=0;

if(pcf8563_sda)

{

busy=1;

}

else

{

_nop_();

_nop_();

pcf8563_scl=0;

busy=0;

}

}

void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据

{

start_pcf8563();

Send_pcf8563_byte(0xa2);

if(!busy)

{

Send_pcf8563_byte(subadd);

if(!busy)

{

Send_pcf8563_byte(dat);

}

}

stop_pcf8563();

}

void read_pcf8563() //读当时的时,分,钞

{

start_pcf8563();

Send_pcf8563_byte(0xa2);

if(!busy)

{

Send_pcf8563_byte(0x02);

if(!busy)

{

start_pcf8563();

Send_pcf8563_byte(0xa3);

receive_pcf8563_byte();

sec=number&0x7f;

start_pcf8563();

Send_pcf8563_byte(0xa3);

receive_pcf8563_byte();

min=number&0x7f;

start_pcf8563();

Send_pcf8563_byte(0xa3);

receive_pcf8563_byte();

hou=number&0x3f;

}

}

stop_pcf8563();

}

void receive_pcf8563_byte() //从PCF8563接受一个字节

{uchar cc;

pcf8563_sda=1;

number=0;

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

{

number<<=1;

pcf8563_scl=0;

pcf8563_scl=1;

_nop_();

_nop_();

number= number|pcf8563_sda;

}

pcf8563_scl=0;

_nop_();

_nop_();

}

void start_pcf8563() //开启PCF8563IIC

{

pcf8563_sda=1;

pcf8563_scl=1;

pcf8563_sda=0;//SCL为高,SDA执行一个下跳

pcf8563_scl=0;//SCL为低,嵌住数据线

}

void stop_pcf8563() //关闭PCF8563IIC

{

pcf8563_sda=0;

pcf8563_scl=1;

pcf8563_sda=1;//SCL为高,SDA执行一个上跳

pcf8563_scl=0;//SCL为低,嵌住数据线

}

void main(void)

{

write_pcf8563(0x02,sec); //写钞

write_pcf8563(0x03,min); //写分

write_pcf8563(0x04,hou); //写时

while(1)

{

read_pcf8563();//读当前时间

spit_time(); //切换时间,为显示做准备

}

}

如果还是不行,你把你的代码给我看看,看我能不能看出来

以上就是关于使用iic模块读写24c256,有的时候24c256无应答,怎么回事 初学单片机,请大家帮帮忙全部的内容,包括:使用iic模块读写24c256,有的时候24c256无应答,怎么回事 初学单片机,请大家帮帮忙、IIC无法从RDA5820中读取数据、51单片机 IIC总线 写24C02 问题 看程序 高分悬赏 错误原因。。。。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9360244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存