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

📄 24c08_twi.c

📁 AVR单片机与24C02的通信的I2c源码。
💻 C
字号:
#include <iom88v.h>

//define avr88's PIN
#define PINSCL 0;  //PC5--SCL
#define PINSDA 1;  //PC4--SDA

//define avr88's fscl
#define fSCL 100000   //define TWI's CLK 100k

//预分频系数=1(TWPS=0)
/*
#if F_CPU < fSCL*36
  #define TWBR_SET    10;     //TWBR必须大于等于10
#else
  #define TWBR_SET    (F_CPU/fSCL-16)/2; //计算TWBR值
#endif*/

//TWCR为0xc4,TWI start work.
#define TW_ACT    (1<<TWINT)|(1<<TWEN)|(1<<TWIE)


//define slave component's adress
//because 24c02's e0,e1,e2 connect to GND
#define SLA_24c02 0xA0
#define ADDR_24C02 0x00  

//define TWI operator mode
#define TWI_Busy 0
#define TWI_OK   1
#define TWI_Fail 2

//define TWI R/W command
#define OP_BUSY    0
#define OP_RUN     1


//TWI读写操作公共步骤
#define ST_FAIL    0 //出错状态
#define ST_START   1 //START状态检查
#define ST_SLAW    2 //SLAW状态检查
#define ST_WADDR   3 //ADDR状态检查
//TWI读操作步骤
#define ST_RESTART   4 //RESTART状态检查
#define ST_SLAR      5 //SLAR状态检查
#define ST_RDATA     6 //读取数据状态检查,循环n字节
//TWI写操作步骤
#define ST_WDATA     7 //写数据状态检查,循环n字节

#define FAIL_MAX     20 //重试次数最大值


//定义全局变量
unsigned char ORGDATA[8]=
    {0xAA,0xA5,0x55,0x5A,0x01,0x02,0x03,0x04}; //原始数据
unsigned char CMPDATA[8];       //比较数据
unsigned char BUFFER[256];      //缓冲区,可以装载整个AC24C02的数据

struct str_TWI         //TWI数据结构
{
    volatile unsigned char STATUS;    //TWI_操作状态
    unsigned char SLA;      //从设备的器件地址
    unsigned int ADDR;      //从设备的数据地址
    unsigned char *pBUF;      //数据缓冲区指针
    unsigned int DATALEN;     //数据长度
    unsigned char STATE;      //TWI读写操作步骤
    unsigned char FAILCNT;     //失败重试次数
};

struct str_TWI strTWI;       //TWI的数据结构变量


//AT24C02的读写函数(包括随机读,连续读,字节写,页写)
//根据sla的最低位决定(由中断程序中判断)
//bit0=1 TW_READ  读
//bit0=0 TW_WRITE 写
#define TWI_READ 1
#define TWI_WRITE 0

//  sla   器件地址(不能搞错)
// addr  EEPROM地址(0~1023)
// *ptr  读写数据缓冲区
// len   读数据长度(1~1024),写数据长度(1 or 8 or 16)
//  返回值  是否能执行当前操作
unsigned char TWI_RW(unsigned char sla,unsigned int addr,unsigned char *ptr,unsigned int len)
{
    unsigned char i;
	
	if(strTWI.STATUS==TWI_Busy)
	{
	   return OP_BUSY;
	}
	
	strTWI.STATUS = TWI_BUSY;
	
    i=(addr>>8)<<1;
    i&=0x06;         //考虑了24C04/08的EEPROM地址高位放在SLA里面
	
}




int main(void)
{

	return 0;
}

⌨️ 快捷键说明

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