avr复习笔记--iic读写多个24cxxx
扫描二维码
随时随地手机看文章
实际上还是仅仅备份些代码,加些注释,因为这本身就很容易,没啥多说的。。。
先定义些东西
#define PORT_IIC PORTC
#define DDR_IIC DDRC
#define BIT_SCL 0
#define BIT_SDA 1
#define TW_START 0X08
#define TW_REP_START 0X10
#define TW_MT_SLA_ACK 0X18
下面切入正题
iic总线初始化
void iic_init(void)
{
TWSR=0;
TWBR=32;//这点要注意下,不要设的速度太高,否则
//proteus仿真可能读不到数据
TWAR=0;
TWCR=(1< PORT_IIC|=(1< } iic初始与终止位 unsigned char iic_start(void) { TWCR=(1< while(!(TWCR&(1< if ((TWSR & 0xF8) != TW_START&&(TWSR & 0xF8) != TW_REP_START) { return 0; } else { return 1; } } void iic_stop(void) { TWCR=(1< } iic读取 unsigned char iic_read(unsigned int ack) { char data; if(ack==1) { TWCR=(1< } else { TWCR=(1< } while(!(TWCR&(1< data=TWDR; return data; } iic写入 unsigned char iic_write(unsigned char data) { unsigned char ack=1; TWDR=data; TWCR=(1< while(!(TWCR&(1< if((TWSR&0XF8)!=TW_MT_SLA_ACK)//检测应答位 { ack=0; } else { ack=1; } return ack; } eeprom片选 static unsigned char cs ; void eeprom24s_set_cs(unsigned char addr) { cs=addr; } eeprom读取 unsigned char eeprom24s_read(unsigned int addr) { unsigned char data; iic_start(); iic_write(cs<<1); iic_write(addr>>8); iic_write(addr); iic_start(); iic_write((cs<<1)|0x01); data=iic_read(0); iic_stop(); delay_us(10);//延时很重要,否则proteus可能出错 return data; } eeprom写入 unsigned char eeprom24s_write(unsigned int addr,unsigned char data) { iic_start(); iic_write(cs<<1); iic_write(addr>>8); iic_write(addr); iic_write(data); iic_stop(); delay_ms(10);)//延时很重要,否则proteus可能出错 } 测试用例 Code 测试截图