|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请大家看一下我这段程序有什么问题(I2C的) |
作者:wx7134 栏目:单片机 |
我是用I/O口模拟的 void readPCF563(void) { i2cstart(); i2csend(0xa2); i2csend(0x00); i2cstop(); i2cstart(); i2csend(0xa3); for (i=0;i<10;i++) { i2cstart(); time_buf[i]=i2creceive(); if(i!=1) i2cack();//除最后一个字节外,其他都要从MASTER发应答。 } i2cnack(); i2cstop(); } // I2C起始 void i2cstart (void) { SDA=1;delay(0); SCL=1;delay(0); SDA=0;delay(0); SCL=0;delay(0); } // I2C停止 void i2cstop (void) { SDA=0;delay(50); SCL=1;delay(50); SDA=1;delay(50); } // I2C应答 void i2cack (void) { SDA=0;delay(50); SCL=1;delay(50); SCL=0;delay(50); } // I2C非应答 void i2cnack (void) { SDA=1;delay(50); SCL=1;delay(50); SCL=0;delay(50); } // I2C发送一个字节 void i2csend (uchar out_byte) { for(i=0;i<8;i++) { SCL=0; delay(50); if(((out_byte >> 7) & 0x01) == 0x01) { SDA=1;delay(50); } else { SDA=0;delay(50); } SCL=1; delay(50); out_byte<<=1; } SCL=0; delay(50); SDA=1; delay(50); } // I2C接收一个字节 uchar i2creceive (void) { timesfr=0; SCL=0;delay(50); SDA=1;delay(50); for(i=0;i<8;i++) { timesfr<<=1; SCL=0;delay(50); SCL=1;delay(50); timesfr|=SDA;delay(50); } SCL=0;delay(50); return timesfr; } |
2楼: | >>参与讨论 |
作者: wx7134 于 2006/5/12 18:33:00 发布:
我用的单片机是C8051F005 我用的单片机是C8051F005 |
3楼: | >>参与讨论 |
作者: freego 于 2006/5/12 18:42:00 发布:
你在这里没有使用从机应答位 延时当然也可以但是这样异常时诊断就成问题了。其实iic看起来挺简单,但是编得严谨也挺花功夫的。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |