⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 I2C的实现代码。包括源程序、头文件。适合在arm上做仿真实现。
💻 C
字号:
#include "option.h"
#include "def.h"
#include "44b.h"
#include "44blib.h"

// 对24C02的读、写
// extern void DelayMs(unsigned int);
// extern void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
// extern void Write24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);

/***************************************************************************/
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1

/***************************************************************************/



#define SDA1  rPDATF|=0x2 ; 
#define SDA0  rPDATF&=0xfd;
#define SCL1  rPDATF|=0x1;
#define SCL0  rPDATF&=0xfe;  

void delay(int i){
for(;i>0;i--)
;
}

/***************************************************************************/
void DelayMs(unsigned int number) {
int i;
for(i=0;i<number*10000;i++)
     ;  
}

/***************************************************************************/
void Start() {
 SDA1;
 delay(100);
 SCL1;
  delay(100);
 SDA0;
  delay(100);
 SCL0;
  delay(100);
}

/***************************************************************************/
void Stop() {
 SCL0;
  delay(100);
 SDA0;
  delay(100);
 SCL1;
  delay(100);
 SDA1;
  delay(100);
}

/***************************************************************************/
void Ack() {
 SDA0;
  delay(100);
 SCL1;
  delay(100);
 SCL0;
  delay(100);
 SDA1;
  delay(100);
}

/***************************************************************************/
void NoAck() {
 SDA1;
  delay(100);
 SCL1;
  delay(100);
 SCL0;
  delay(100);
}

/***************************************************************************/
char TestAck() {
 char ErrorBit;
 SDA1;
  delay(100);
 SCL1;
 rPCONF&=~0xc;
while((rPDATF&0x2)!=0);
 rPCONF|=0x4;
 SCL0;
 return(ErrorBit);
}

/***************************************************************************/
char Write8Bit(unsigned char input) {
 unsigned char temp,i;
 for(temp=8;temp!=0;temp--) {
  
if(input&0x80){
  SDA1;}
else { SDA0;

}

 delay(100);
  SCL1;
   delay(100);
  SCL0;
  input=input<<1;
 }
}

/***************************************************************************/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) {
 int i;
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(RomAddress);
 TestAck();
 for(i=0;i<number;i++) {
 
  Write8Bit(*Wdata);
  TestAck();
  Wdata++;
 }
 Stop();
 DelayMs(10);
}

/***************************************************************************/
unsigned char Read8Bit() {
 unsigned char temp,rbyte=0;
  rPCONF&=~0xc;
 for(temp=8;temp!=0;temp--) {
  SCL1;
  rbyte=rbyte<<1;
  
  rbyte=rbyte|((unsigned char)((rPDATF&0x2)?1:0));

  SCL0;
   delay(100);
 }
    rPCONF|=0x4;
 return(rbyte);
}

/***************************************************************************/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) {
// unsigned char temp,rbyte;
 Start();
 Write8Bit(WriteDeviceAddress);
 TestAck();
 Write8Bit(RomAddress);
 TestAck();
 Start();
 Write8Bit(ReadDviceAddress);
 TestAck();
 while(bytes!=1) {
 *RamAddress=Read8Bit();
 Ack();
 RamAddress++;
 bytes--;
 }
 *RamAddress=Read8Bit();
 NoAck();
 Stop();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -