|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
24C02怎么读出来是0xff,求助! |
作者:mxinfa 栏目:单片机 |
先是自己写了一个不行,用网上广泛流传的下面这个程序还是不行,感觉这个程序写的挺清晰的,位定义已经根据实际硬件进行了定义,也换过片子,晶振11.0592,写保护脚已经接到0(没有写保护了),读出来总是0xff,两天了焦头烂额了,谢谢各位 // 24C02读写程序 #define uCHAR unsigned CHAR #define uint unsigned int #include <reg52.h> #include <stdio.h> #include <absacc.h> sbit scl=P3^5; //24C02 SCL sbit sda=P3^4; //24C02 SDA sbit DOG=P1^7; //狗 uCHAR x24C02_read(uCHAR address); //从24C02的地址address中读取一个字节数据 void x24C02_write(uCHAR address,uCHAR info); //向24C02的address地址中写入一字节数据info void x24C02_init(); //24C02初始化子程序 void delay1(uCHAR x); void FLASH(); void x24c01_init(); void start(); void stop(); void writex(uCHAR j); uCHAR readx(); void clock(); void delay1(uCHAR x) { uint i; for(i=0;i<x;i++); DOG=~DOG; } void FLASH() { // uCHAR u; DOG=~DOG; } void x24C02_init() { scl=1; FLASH(); sda=1; FLASH(); } void start() { sda=1; FLASH(); scl=1; FLASH(); sda=0; FLASH(); scl=0; FLASH(); } void stop() { sda=0; FLASH(); scl=1; FLASH(); sda=1; FLASH(); } void writex(uCHAR j) { uCHAR i,TEMP; TEMP=j; for (i=0;i<8;i++){ TEMP=TEMP<<1; scl=0; FLASH(); sda=CY; FLASH(); scl=1; FLASH(); } scl=0; FLASH(); sda=1; FLASH(); } uCHAR readx() { uCHAR i,j,k=0; scl=0; FLASH(); sda=1; for (i=0;i<8;i++){ FLASH(); scl=1; FLASH(); if (sda==1) j=1; else j=0; k=(k<<1)|j; scl=0; } FLASH(); return(k); } void clock() { uCHAR i=0; scl=1; FLASH(); while ((sda==1)&&(i<255))i++; scl=0; FLASH(); } uCHAR x24C02_read(uCHAR address) { uCHAR i; start(); writex(0xa0); clock(); writex(address); clock(); start(); writex(0xa1); clock(); i=readx(); stop(); delay1(10); return(i); } void x24C02_write(uCHAR address,uCHAR info) { EA=0; start(); writex(0xa0); clock(); writex(address); clock(); writex(info); clock(); stop(); EA=1; delay1(50); } |
2楼: | >>参与讨论 |
作者: ayb_ice 于 2007/3/31 9:37:00 发布:
传个给你,但只有连续读功能 /*---------------------------------------------------------------------- *---------------------------------------------------------------------- * * 优 利 德 集 团 有 限 公 司 * U N I-T R E N D G R O U P L I M I T E D * http: //www.uni-trend.com.cn * *---------------------------------------------------------------------- * 文 件 名: AT24C02.c * 创 建 人: 艾艳斌(E-mail:ayb_ice@yahoo.com.cn) * 版 本: V1.0 / 2007-03-23 * 描 述: ATMEL 24C02模拟IIC程序(只有连续读) *---------------------------------------------------------------------- * 修 改 人: * 版 本: * 描 述: *---------------------------------------------------------------------- *---------------------------------------------------------------------- */ //传个给你,但只有连续读功能,这是我前段时间回复的帖子,基本程序都有,很容易添加其它程序 sbit IIC_SDA = P1^3; sbit IIC_SCL = P1^2; #define U8 unsigned CHAR #define _2402_READ 0xA1 // 读 #define _2402_WRITE 0xA0 // 写 #define IIC_FALSE 0 // 失败 #define IIC_TRUE 1 // 成功 #define IIC_ACK 0 // ACK #define IIC_NACK 1 // NACK #define IIC_DELAY 20 // 根据CPU速度适当修改 //------------------------------------------------------ // iic_delay //------------------------------------------------------ // // I2C延时 // void iic_delay(void) { U8 delay; delay = IIC_DELAY; while(delay) delay--; } //------------------------------------------------------ // iic_start //------------------------------------------------------ // // I2C开始信号 // void iic_start(void) { IIC_SDA = 1; IIC_SCL = 1; iic_delay(); IIC_SDA = 0; iic_delay(); IIC_SCL = 0; IIC_SDA = 1; } //------------------------------------------------------ // iic_stop //------------------------------------------------------ // // I2C停止信号 // void iic_stop(void) { IIC_SDA = 0; iic_delay(); IIC_SCL = 1; iic_delay(); IIC_SDA = 1; iic_delay(); IIC_SCL = 0; } //------------------------------------------------------ // iic_send //------------------------------------------------------ // // 发送一个字节 // byte = 数据 // 返回: IIC_FALSE = 失败, IIC_TRUE = 成功 // U8 iic_send(U8 byte) { U8 i; for(i=8; i; i--){ byte <<= 1; IIC_SDA = CY; iic_delay(); IIC_SCL = 1; iic_delay(); IIC_SCL = 0; } iic_delay(); IIC_SDA = 1; iic_delay(); IIC_SCL = 1; //----------------------------------- // 等待从机应答,超时失败自动退出 for(i=0xFF; i; i--){ if(!IIC_SDA){ IIC_SCL = 0; return IIC_TRUE; } } iic_stop(); return IIC_FALSE; } //------------------------------------------------------ // iic_receive //------------------------------------------------------ // // 接收一个字节 // ack : 应答信号ACK或NACK // 返回: 接收的字节 // 注: 软件模拟方式无法判断是否成功或失败,所以总是成功 // U8 iic_receive(U8 ack) { U8 i; U8 TEMP; IIC_SDA = 1; TEMP = 0; for(i=8; i; i--){ TEMP <<= 1; IIC_SCL = 1; iic_delay(); if(IIC_SDA) TEMP++; IIC_SCL = 0; iic_delay(); } //----------------------------------- // 主机应答从机 // IIC_SDA = 0; // ACK IIC_SDA = ack; // ACK or NACK =>2007-02-06 iic_delay(); IIC_SCL = 1; iic_delay(); IIC_SCL = 0; iic_delay(); IIC_SDA = 1; // 接收结束时IIC_SDA=1 return TEMP; } //------------------------------------------------------ // lm75a_xread //------------------------------------------------------ // // LM75A连续读 // register_add = 寄存器地址(0~3) // NUMBER = 连续读字节数 // pi = 数据保存地址 // 返回: IIC_FALSE = 失败, IIC_TRUE = 成功 // 注: 为了简化软件,只有连续读,没有单字节读,但定义有单字节读宏 // U8 iic_xread(U8 register_add, U8 NUMBER, U8* pi) { iic_start(); if(iic_send(_2402_WRITE) == IIC_FALSE){ return IIC_FALSE; } if(iic_send(register_add) == IIC_FALSE){ return IIC_FALSE; } iic_start(); if(iic_send(_2402_READ) == IIC_FALSE){ return IIC_FALSE; } for( ; NUMBER; NUMBER--){ if(NUMBER == 1) pi[0] = iic_receive(IIC_NACK); // 读取最后一个字节 else pi[0] = iic_receive(IIC_ACK); |
3楼: | >>参与讨论 |
作者: mxinfa 于 2007/3/31 16:55:00 发布:
马上测,有结果公布 马上测,有结果公布 |
4楼: | >>参与讨论 |
作者: mxinfa 于 2007/3/31 16:58:00 发布:
读出来还是0xff 是不是前面我自己的程序就没有写进去啊? 写保护我是用一个18欧的电阻接地的,没有关系吗?用表量确实是低 ayb_ice麻烦再传个写的函数好吗?谢谢 |
5楼: | >>参与讨论 |
作者: mxinfa 于 2007/3/31 17:17:00 发布:
用了两个版本的写的函数读出来还是0xff 试了两个版本的写函数读出来还是0xff,板子上这片24C02至少还能读出来0xff,试了其他三片,一片AT24C02,两片24C04厂家看不清好像是st chn,连什么东西都读不出来,不会碰到了传说中的假片了吧? 大家给个建议呀? ayb_ice怎么看? |
6楼: | >>参与讨论 |
作者: qjy_dali 于 2007/3/31 18:49:00 发布:
2楼I2C的程序写的和我的几乎一样! |
7楼: | >>参与讨论 |
作者: ayb_ice 于 2007/4/2 8:18:00 发布:
传个字节写的部分给你 //------------------------------------------------------ // iic_send //------------------------------------------------------ // // 发送一个字节,失败后会停止总线(发送stop) // byte = 数据 // 返回: IIC_FALSE = 失败, IIC_TRUE = 成功 // U8 iic_send(U8 byte) { U8 i; for(i=8; i; i--){ byte <<= 1; IIC_SDA = CY; iic_delay(); IIC_SCL = 1; iic_delay(); IIC_SCL = 0; } iic_delay(); IIC_SDA = 1; iic_delay(); IIC_SCL = 1; //----------------------------------- // 等待从机应答,超时失败自动退出 for(i=0xFF; i; i--){ if(!IIC_SDA){ IIC_SCL = 0; return IIC_TRUE; } } //----------------------------------- // 失败停止总线 iic_stop(); return IIC_FALSE; } //------------------------------------------------------ // iic_write //------------------------------------------------------ // // 写一个字节 // address = LCD RAM 数据地址 // lcd_data = 数据 // 返回: IIC_FALSE = 失败, IIC_TRUE = 成功 // U8 iic_write(U8 address, U8 lcd_data) { iic_start(); if(iic_send(_2402_WRITE) == IIC_FALSE){ return IIC_FALSE; } if(iic_send(address) == IIC_FALSE){ return IIC_FALSE; } if(iic_send(lcd_data) == IIC_FALSE){ return IIC_FALSE; } iic_stop(); return IIC_TRUE; } |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |