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

📄 i2c.c

📁 avr atmega168v 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 + -