📄 i2c.c
字号:
//ICC-AVR application builder : 2007-12-5 17:34:01
// Target : m48
// Crystal: 1.0000Mhz
//use uart
//I2C:read and write at24c02
#include <iom168v.h>
#include <macros.h>
#include <myfun.h>
//#include <I2C.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_ACK 0x50
#define MR_DATA_NACK 0x58
#define SLA_W 0xA0
#define SLA_R 0xA1
#define ADDRESS 0x00
#define DATA 0x55
void port_init(void)
{
//set LED PIN output
DDRC |= (1<<DDC3);DDRC |= (1<<DDC2);DDRC |= (1<<DDC1);DDRC |= (1<<DDC0);
DDRD |= (1<<DDD7);DDRD |= (1<<DDD6);DDRD |= (1<<DDD5);DDRD |= (1<<DDD4);
//set LED off
PORTD = 0xF0;PORTC = 0x0F;
}
void Error()
{
USART_Transmit(TWSR & 0xF8);
while(1)
LedBlk();
}
//****TWI_ByteW()****//
void TWI_ByteW(unsigned char add,unsigned data)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //START
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != START) //check
Error();
TWDR = SLA_W; //send SLA_W
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MT_SLA_ACK) //check
Error();
TWDR = add; //send address
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MT_DATA_ACK) //check
Error();
TWDR = data; //send data
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MT_DATA_ACK) //check
Error();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //send stop
Delayus(150);
}
//****TWI_CByteR()****//
unsigned char TWI_CByteR()
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //START
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != START) //check
Error();
TWDR = SLA_R; //send SLA_R
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MR_SLA_ACK) //check
Error();
TWCR = (1<<TWINT) | (1<<TWEN); //receive data
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MR_DATA_NACK) //check
Error();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //send stop
return TWDR;
}
//****TWI_ByteR()****//
unsigned char TWI_ByteR(unsigned char add)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //START
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != START) //check
Error();
TWDR = SLA_W; //send SLA_W
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MT_SLA_ACK) //check
Error();
TWDR = add; //send address
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MT_DATA_ACK) //check
Error();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //ReSTART
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != ReSTART) //check
Error();
TWDR = SLA_R; //send SLA_R
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MR_SLA_ACK) //check
Error();
TWCR = (1<<TWINT) | (1<<TWEN); //receive data
while(!(TWCR & (1<<TWINT))) //wait for int
;
if((TWSR & 0xF8) != MR_DATA_NACK) //check
Error();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //send stop
return TWDR;
}
void main(void)
{
unsigned char data;
CLI();
port_init();
USART_Init();
SEI();
TWI_ByteW(0x00,0xA0);
TWI_ByteW(0x01,0xA1);
TWI_ByteW(0x02,0xA2);
TWI_ByteW(0x03,0xA3);
TWI_ByteW(0x04,0xA4);
TWI_ByteW(0x05,0xA5);
TWI_ByteW(0x06,0xA6);
TWI_ByteW(0x07,0xA7);
TWI_ByteW(0x08,0xA8);
TWI_ByteW(0x09,0xA9);
USART_Transmit(TWI_ByteR(0x00));
USART_Transmit(TWI_ByteR(0x01));
USART_Transmit(TWI_ByteR(0x02));
USART_Transmit(TWI_ByteR(0x03));
USART_Transmit(TWI_ByteR(0x04));
USART_Transmit(TWI_ByteR(0x05));
USART_Transmit(TWI_ByteR(0x06));
USART_Transmit(TWI_ByteR(0x07));
USART_Transmit(TWI_ByteR(0x08));
USART_Transmit(TWI_ByteR(0x09));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -