完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
以下是我写的I2C总线写E2PROM,然后读取出写入的数据,使P1口赋值为0XAA,但是为什么读出来的数据始终为0XFF呢?看了好多遍了,都不知道哪里出了错,只是仿真过读数错误,没烧写进单片机去试
#include #define uint unsigned int #define uchar unsigned char ***it SDA_i2c=P2^0; ***it SCL_i2c=P2^1; void delay_us() { ; ; } void delay_ms(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void init_i2c() //初始化I2C总线 { SDA_i2c=1; //SDA拉高 delay_us(); SCL_i2c=1; //SCL拉高 delay_us(); } void start_i2c() //I2C启动信号 { SDA_i2c=1; //SDA拉高 delay_us(); SCL_i2c=1; //SCL至高 delay_us(); SDA_i2c=0; //SDA跳低 delay_us(); } void stop_i2c() //I2C停止信号 { SDA_i2c=0; //SDA置低 delay_us(); SCL_i2c=1; //SCL至高 delay_us(); SDA_i2c=1; //SDA跳高 delay_us(); } void respond_i2c() //I2C应答信号 { uchar i; SCL_i2c=1; delay_us(); while((SDA_i2c==1)&&(i<250)) i++; SCL_i2c=0; delay_us(); SDA_i2c=1; delay_us(); } void write_i2cByte(uchar dat) //I2C写字节 { uchar i,temp; temp=dat; SCL_i2c=0; delay_us(); for(i=0;i<8;i++) { temp=temp<<1; SCL_i2c=0; delay_us(); SDA_i2c=CY; delay_us(); SCL_i2c=1; delay_us(); } SCL_i2c=0; delay_us(); SDA_i2c=1; delay_us(); } void write_i2cAddressData(uchar address,uchar dat) //在某地址写入某数据 { start_i2c(); write_i2cByte(0xae); respond_i2c(); write_i2cByte(address); respond_i2c(); write_i2cByte(dat); respond_i2c(); stop_i2c(); } uchar read_byte() //I2C读字节 { uchar i,i2c_dat; SCL_i2c=0; delay_us(); SDA_i2c=1; delay_us(); for(i=0;i<8;i++) { SCL_i2c=0; delay_us(); i2c_dat=(i2c_dat<<1)|SDA_i2c; delay_us(); SCL_i2c=1; delay_us(); } return i2c_dat; } uchar read_i2cAddress(uchar address) //从某个地址中读出数据 { uchar date; start_i2c(); write_i2cByte(0xae); respond_i2c(); write_i2cByte(address); respond_i2c(); start_i2c(); write_i2cByte(0xaf); respond_i2c(); date=read_byte(); stop_i2c(); return date; } void main() { init_i2c(); write_i2cAddressData(1,0xaa); delay_ms(100); P1=read_i2cAddress(1); while(1); } |
|
相关推荐
3个回答
|
|
为什么不烧进去试呢,用的什么住真器,量一下EEPROM的供电电压
|
|
|
|
我也是刚学,之前也做个这个程序,当时我出现的问题是在应答和非应答函数里面,后来严格按照时序图写就好了。不过具体原理我还是不太明白,打算再重新去看看,你可以该下试试,
在应答里面:先把让SCL=0delay();SDA=1delay();再接受应答(1位就好了)delay,scl=1delay();再SCL=0; 非应答里:先SCL=0;delay();再发送非应答(SDA=1)delay();,SCL=1;delay();scl=0; |
|
1 条评论
|
|
我实验成功了,其实I2C是通过单片机IO口给E2PROM写入地址和数据,然后读的时候通过IO口从E2PROM指定地址读出写入的数据,完全根据51IO口模拟出来的I2C时序
昨天为什么不成功,分析了一下,SDA和SCL要接上拉电阻,我的实验板上24c02芯片没有接上拉电阻,这时我把P2口直接接SDA和SCL,烧进去程序也不对,后来原封不动的程序,将SDA和SCL口接P0口,由于P0口外部有接上拉电阻,另外这个程序再定义一个WP=P0^3,进入主程序将WP拉低,就可以通过I2C总线写入E2PROM的24C02了,读的时候也可以读取了。 程序是没有问题的,还是谢谢你们了!{:soso_e152:} |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
122 浏览 0 评论
565 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
772 浏览 0 评论
948 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
658 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12041 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 19:06 , Processed in 0.582307 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号