📄 i2c._c
字号:
#include<iom128v.h>
#include<iom128v.h>
#define START 0x08
#define restart 0x10
#define MT_SLA_ACK 0x18
#define MT_DATA_ACK 0x28
#define MR_SLA_ACK 0x40
#define MR_DATA_NOACK 0x58
#define wr_device_adress 0xa0;
#define rd_device_adress 0xa1;
#define start TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)
#define wait { while(!(TWCR&(1<<TWINT)));}
#define stop TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
#define write8bit(c){TWDR=c;TWCR=(1<<TWINT)|(1<<TWEN);}
#define Twi (TWCR=(1<<TWINT)|(1<<TWEN))
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<=8000;i++);
}
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1ms();
}
unsigned char i2cwrite(unsigned char data,unsigned char romadress)
{
start;
wait;
if((TWSR&0xf8)!=START) return 1;
write8bit(wr_device_adress);
wait;
if((TWSR&0xf8)!=MT_SLA_ACK) return 1;
write8bit(romadress)
wait;
if((TWSR&0xf8)!=MT_DATA_ACK) return 1;
write8bit(data);
wait;
if((TWSR&0xf8)!=MT_DATA_ACK) return 1;
stop;
delay_ms(10);
return 0;
}
unsigned char i2cread(unsigned char romadress)
{unsigned char temp;
start;
wait;
if((TWSR&0xf8)!=START)
return 1;
write8bit(wr_device_adress);
wait;
if((TWSR&0xf8)!=MT_SLA_ACK) return 1;
write8bit(romadress);
wait;
if ((TWSR&0xf8)!=MT_DATA_ACK) return 1;
start;
wait;
if ((TWSR&0xf8)!=restart) return 1;
write8bit(rd_device_adress);
wait;
if((TWSR&0xf8)!=MR_SLA_ACK) return 1;
Twi;
wait;
if((TWSR&0xf8)!=MR_DATA_NOACK) return 1;
temp=TWDR;
stop;
return temp;
}
void twi_init(void)
{
DDRD=0XFF;
PORTD=0Xff;
TWCR= 0X00; //disable twi
TWBR= 0x64; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= 0x04; //enable twi
}
void main(void)
{
unsigned char data=0x00;
unsigned char adress=0x00;
twi_init();
while(1)
{
for(data=0x00,adress=0x00;adress<255;data++,adress++)
{i2cwrite(data,adress);
DDRB=0xFF;
if(data==i2cread(adress))
{delay_ms(5);
PORTB=i2cread(adress);
delay_ms(0);}
else
{PORTB=0xff;
while(1);}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -