No.65530 作者:weigoat 邮件:weigoat@sina.com ID:25296 登陆:7次 文章数:3篇 最后登陆IP:221.4.230.146 最后登陆:2010/8/12 18:27:51 注册:2004/9/5 16:56:18 财富:128 发帖时间:2004/10/30 19:49:21 发贴者IP:218.18.28.154 标题:weigoat:菜鸟初次使用I2C总线.请大家请点! 摘要:No.65530菜鸟初次使用I2C总线.请大家请点! 我在用24C02时。读写操作,有时正确,有时不正确。搞不清什么原因。请各位帮忙分析下 我的程序。先谢谢各位。以下是程序: #include <reg51.h> #include <intrins.h> #define TRUE 0 #define FALSE 1 #define uchar unsigned char #define WriteCMD 0xa0 #define ReadCMD 0xa1 #define SomeNOP(); _nop_();_nop_();_nop_();_nop_();_nop_(); sbit SDA=P1^0; sbit SCL=P1^1; sbit WP=P1^2; void DelayMs(unsigned int t) { uchar temp; while(t--) { for(temp=125;temp> 0;temp--); } } /*------------------------------------------*/ /*功能:启动总线 /*------------------------------------------*/ bit StartI2C() { SDA=1; SCL=1; if(SDA==1) { SDA=0; SomeNOP(); SCL=0; SomeNOP(); SDA=1; return TRUE; } else return FALSE; } /*------------------------------------------*/ /*功能:停止总线 /*------------------------------------------*/ void StopI2C() { SDA=0; SomeNOP(); SCL=1; SomeNOP(); SDA=1; SomeNOP(); SCL=0; } /*------------------------------------------*/ /*功能:单片机送应答位0 /*------------------------------------------*/ void Ack() { SDA=0; SomeNOP(); SCL=1; SomeNOP(); SCL=0; SomeNOP(); } /*------------------------------------------*/ /*功能:单片机送不应答位1 /*------------------------------------------*/ void NoAck() { SDA=1; SomeNOP(); SCL=1; SomeNOP(); SCL=0; SomeNOP(); } /*------------------------------------------*/ /*功能:等待24c02送应答位0 /*------------------------------------------*/ bit WaittAck() { unsigned char errtime=255; SDA=1;SomeNOP(); SCL=1;SomeNOP(); if(SDA==1) { SCL=0; return FALSE; } else { SCL=0; return TRUE; } } /*------------------------------------------*/ /*功能:单片机写8位数据到总线 /*------------------------------------------*/ Write8Bit(unsigned char input) { unsigned char temp; for(temp=8;temp!=0;temp--) { SCL=0;SomeNOP(); SDA=(bit)(input&0x80); input=input < <1; SomeNOP(); SCL=1; SomeNOP(); } SCL=0; DelayMs(10); } /*------------------------------------------*/ /*功能:写一个字节到24c02某一单元 /*------------------------------------------*/ void Write_One_Byte(unsigned char addr,unsigned char thedata) { StartI2C() ; Write8Bit(WriteCMD); WaittAck(); Write8Bit(addr);/*address*/ WaittAck(); Write8Bit(thedata);/*thedata*/ WaittAck(); StopI2C(); DelayMs(50); } /*------------------------------------------*/ /*功能:连续写多个字节到24c02某连续单元 /*------------------------------------------*/ void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) { StartI2C(); Write8Bit(WriteCMD); WaittAck(); Write8Bit(RomAddress); WaittAck(); for(;number!=0;number--) { Write8Bit(*Wdata); WaittAck(); Wdata++; } StopI2C(); DelayMs(50); } /*------------------------------------------*/ /*功能:从总线读8位数据 /*------------------------------------------*/ unsigned char Read8Bit() { unsigned char temp,rbyte=0; SDA=1; for(temp=8;temp!=0;temp--) { SCL=1; rbyte=rbyte < <1; rbyte=rbyte|((unsigned char)(SDA)); SCL=0; SomeNOP(); } return(rbyte); } /*------------------------------------------*/ /*功能:从24c02某单元读一个字节 /*------------------------------------------*/ unsigned char Read_One_Byte(unsigned char addr) { bit acktemp=1; char mydata; StartI2C(); Write8Bit(WriteCMD); WaittAck(); Write8Bit(addr); WaittAck(); StartI2C(); Write8Bit(ReadCMD); WaittAck(); mydata=Read8Bit(); NoAck(); StopI2C(); DelayMs(20); return mydata; } /*------------------------------------------*/ /*功能:从24c02某连续单元读多个字节 /*------------------------------------------*/ void Read24c02(unsigned ......
>>返回讨论的主题
|