avr復(fù)習(xí)筆記--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;//這點要注意下,不要設(shè)的速度太高,否則
//proteus仿真可能讀不到數(shù)據(jù)
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)//檢測應(yīng)答位 { 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 測試截圖