|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请教有关24C02的问题! |
作者:jshong 栏目:单片机 |
我写了个24C02的读写程序,测试时发现对有些24C02芯片能够正确读写,但有些却不能正确读写.个位高手帮我看看是不是程序的读写时序有问题.谢谢! 下面是我的程序. #include <reg52.h> #include <absacc.h> #include <intrins.h> typedef unsigned CHAR uCHAR; typedef unsigned int uint; sbit SDA = P1^0; /* iic数据传送位 */ sbit SCL = P1^1; /* iic时钟控制位 */ sbit P1_4 = P1^4; sbit P1_3 = P1^3; sbit P1_5 = P1^5; /* 函数声明 */ void iic_wait(void); /* iic延时 */ void iic_start(void); /* 开启iic总线 */ void iic_stop(void); /* 关闭iic总线 */ void iic_ack(void); /* 发送ACK信号 */ void iic_no_ack(void); /* 发送NOACK信号 */ bit iic_wait_ack(void); /* 等待ACK信号 */ void iic_send_byte(uCHAR demand); /* MCU向iic设备发送一个字节 */ uCHAR iic_receive_byte(void); /* MCU从iic设备接收一个字节 */ /* 声明结束 */ void delay_1s(void) { uCHAR i; uCHAR j; for(i=0;i<100;i++) for(j=0;j<100;j++); } /* iic延时 */ void iic_wait(void) { _nop_(); _nop_(); _nop_(); _nop_(); } /* 开启iic总线 */ void iic_start(void) { SDA = 1; SCL = 1; iic_wait(); SDA = 0; iic_wait(); SCL = 0; } /* 关闭iic总线 */ void iic_stop(void) { SDA=0; SCL=0; iic_wait(); SCL=1; iic_wait(); SDA=1; } /* 发送ACK信号 */ void iic_ack(void) { SDA=0; iic_wait(); SCL=1; iic_wait(); SCL=0; } /* 发送NOACK信号 */ void iic_no_ack(void) { SDA=1; iic_wait(); SCL=1; iic_wait(); SCL=0; } /******************************************************************** 函 数 名:iic_wait_ack 功 能:等待ACK信号 说 明: 入口参数: 返 回 值:1-ACK 0-ERROR ***********************************************************************/ bit iic_wait_ack(void) { uCHAR errtime=255; //uint errtime = 1000; SDA=1; iic_wait(); SCL=1; iic_wait(); while(SDA) { errtime--; if(!errtime) return 0; } SCL=0; return 1; } /******************************************************************** 函 数 名:iic_send_byte 功 能:MCU向iic设备发送一个字节 说 明: 入口参数:sbyte 待发送的字节数据 返 回 值: ***********************************************************************/ void iic_send_byte(uCHAR sbyte) { uCHAR i = 8; while(i--) { SCL = 0; _nop_(); SDA = (bit)(sbyte&0x80); sbyte <<= 1; iic_wait(); SCL = 1; iic_wait(); } SCL=0; } /******************************************************************** 函 数 名:iic_receive_byte 功 能:MCU从iic设备接收一个字节 说 明: 入口参数: 返 回 值:ddata 接收数据 ***********************************************************************/ uCHAR iic_receive_byte(void) { uCHAR i=8; uCHAR ddata=0; SDA=1; while(i--) { ddata <<= 1; SCL=0; iic_wait(); SCL=1; iic_wait(); ddata |= SDA; } SCL=0; return ddata; } /******************************************************************** 函 数 名:write_iic_data 功 能:向iic设备写入N个字节 说 明: 入口参数:write_data 存放写入字节的数组 address 指定从address处开始写入 num 写入的字节数 返 回 值:无 ***********************************************************************/ void write_iic_data(uCHAR write_data[], uCHAR address, uCHAR num) { uCHAR n; iic_start(); iic_send_byte(0xa0); iic_wait_ack(); iic_send_byte(address); iic_wait_ack(); for(n=0; n<num; n++) { iic_send_byte(write_data[n]); iic_wait_ack(); } iic_stop(); } /******************************************************************** 函 数 名:read_iic_data 功 能:从iic设备读取N个字节 说 明: 入口参数:read_data 存放读取字节的数组 address 指定从address处开始读取 num 读取的字节数 返 回 值:无 ***********************************************************************/< |
2楼: | >>参与讨论 |
作者: 程序人生 于 2006/9/25 19:44:00 发布:
网上有很多标准程序下,自己对照下看 |
3楼: | >>参与讨论 |
作者: huangqi412 于 2006/9/25 21:23:00 发布:
呵呵,去看下我的帖子 |
4楼: | >>参与讨论 |
作者: sxl_72 于 2006/9/26 8:50:00 发布:
延时长一点试试 |
5楼: | >>参与讨论 |
作者: DSP99 于 2006/10/1 2:14:00 发布:
I2C的模拟程序包很多啊~~ |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |