你发的时序和命令正确么?
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 问题 看程序 高分悬赏 错误原因。。。。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)