专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
求助PIC18F14K50硬件I2C读写AT24C02问题。
2020-02-06 10:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
1937
16
16
本帖最后由 liulangmao 于 2013-5-9 22:41 编辑
目前总线上波形已经接近AT24C02数据手册上写和读的波形了,个人感觉读取应该是没有问题的,只是写入不能成功。调试期间有一将数据写入到了24C02且读了出来,另有一次是在板子重新上电时读出来,其余读出来都不对。
PCB.jpg
(470.79 KB, 下载次数: 0)
下载附件
2013-5-9 22:27 上传
PCB图,中间图红星是去掉的电阻。
再不行就只能用模拟的方法了。
部分源代码
void I2C_HD_Init(void)
{
//MSSP状态寄存器(I2C模式)
SSPSTAT = 0x80; //压摆率控制位,使用100KHz标准速率,SMBus 选择位,不开启
SSPADD = 0x1D; //(Fosc/100000)/4 - 1; //100KHz总线频率 12MHz/100KHz/4-1 = 0x1D;
SSPCON1 = 0x28; //I2C 主模式,时钟 = FOSC/(4 * (SSPADD + 1)),同步串口使能位,开启
SSPCON2 = 0x00; //Clear Control Bits
DDRBbits.RB4 = 1; //开启SDA和SCL为输入
DDRBbits.RB6 = 1;
PIE1bits.SSPIE = 1;
}
//----------------------------------------I2C写入数据--------------------------------------------
void I2C_HD_Write(void)
{
SSPCON2bits.SEN = 1; // 1:在SDA 和SCL 引脚上发起启动条件。由硬件自动清零。
while ( SSPCON2bits.SEN ); //
SSPBUF = 0xAE; //AT24C02地址1010,A2-A0:111,写入 0.
while(SSPSTATbits.BF); // SSPBUF为空.
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
Delay_us(1);
SSPBUF = 0x0F; //地址.
while(SSPSTATbits.BF); // SSPBUF为空.
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
Delay_us(1);
SSPBUF = 0x7C; //数据124.
while(SSPSTATbits.BF); // SSPBUF为空.
while(SSPCON2bits.ACKSTAT) // 收到应答说明器件写操作成功,否则一直查询 。
{
SSPBUF = 0xAE; //AT24C02地址1010,A2-A0:111,写入 0.
while(SSPSTATbits.BF); // SSPBUF为空.
}
// Delay_us(1);
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
//Delay_us(1);
SSPCON2bits.PEN=1;
while(SSPCON2bits.PEN); //StopI2C2()
Delay_us(1);
}
//----------------------------------------I2C读取--------------------------------------------
void I2C_HD_Read(void)
{
SSPCON2bits.SEN = 1; // 1:在SDA 和SCL 引脚上发起启动条件。由硬件自动清零。
while ( SSPCON2bits.SEN ); //
SSPBUF = 0xAE; //AT24C02地址1010,A2-A0:111,寻址使用伪写 1.
while(SSPSTATbits.BF); // SSPBUF为空.
// Delay_us(1);
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
Delay_us(1);
SSPBUF = 0x0F; //地址.
while(SSPSTATbits.BF); // SSPBUF为空.
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
Delay_us(1);
SSPCON2bits.SEN = 1; // 1:在SDA 和SCL 引脚上发起启动条件。由硬件自动清零。
while ( SSPCON2bits.SEN ); //
SSPBUF = 0xAF; //AT24C02地址1010,A2-A0:111,读取 1.
while(SSPSTATbits.BF); // SSPBUF为空.
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // NotAckI2C1()
Delay_us(1);
SSPCON2bits.RCEN = 1; //使能接受。
while(!SSPSTATbits.BF); // SSPBUF为满.
SSPCON2bits.ACKDT = 0;
SSPCON2bits.ACKEN = 1;
while(SSPCON2bits.ACKEN); // AckI2C1()
// Delay_us(1);
SSPCON2bits.PEN=1;
while(SSPCON2bits.PEN); //StopI2C2()
Buff_Number = SSPBUF; //数据123.
}
void interrupt Isr(void)
{
if(TMR0IF == 1)
{
TMR0IF = 0;
LED = ~LED;
if(LED == 1)
{
I2C_HD_Write();
I2C_HD_Read();
Cont_Number = Buff_Number;
}
else
{
Cont_Number = 12345;
}
TMR0H = Timer0_RH;
TMR0L = Timer0_RL;
}
if(SSPIF == 1)
{
SSPIF = 0; //清中断。
}
}
复制代码
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
ibichao
2020-02-06 17:34
1:要按照手册上的时序来,尤其是最后的应答一定要加上。
2:写每个数据之间要加点延时,否则会出现乱码。
加载中...
查看其它16个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
2:写每个数据之间要加点延时,否则会出现乱码。
一周热门 更多>