[an error occurred while processing this directive]
Для IAR AVR (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено S_agent 20 февраля 2003 г. 21:02
В ответ на: кто нибудь писал програмку управления по шине I2C под AVRы?(+) отправлено alexinsky 20 февраля 2003 г. 20:34

..=======================i2c.c=================
#include"i2c_new.h"

#if 1
void Init_i2c()
{
SCL_0
SDA_0
SDA_inp
SCL_inp
}

void delay(int _del)
{
int i;
for(i=0;i<_del;i++) asm("nop");
}


void Start_i2c()
{

SCL_inp
delay(Del_hp);
SDA_inp
delay(Del_hp);
SDA_out
delay(Del_hp);
SCL_out

}

void Stop_i2c()
{
SDA_out
delay(Del_hp);
SCL_inp
delay(Del_hp);
SDA_inp
}


char Wr_byte_i2c(char _byte)
{
char _count = 8;
do{
SCL_out
delay(Del_hp);
if(End_bit(_byte)) SDA_inp
else SDA_out
delay(Del_hp);
SCL_inp
delay(Del_hp);
_byte <<= 1;
} while(--_count);
SCL_out
delay(Del_hp);
SDA_inp
delay(Del_hp);
SCL_inp
while(!SCL_IN) ;
delay(Del_hp);
_byte = SDA_IN;
SCL_out

return _byte;
}



char Rd_byte_i2c(char _flag)
{
char _count = 8;
char _byte = 0;
SDA_inp
delay(Del_hp);
do{
if(_count != 8) _byte = _byte<<1;
SCL_out
delay(Del_hp);
SCL_inp
delay(Del_hp);
if(SDA_IN) _byte |= 0x01;
} while(--_count);
SCL_out
delay(Del_hp);
if(_flag) SDA_out
else SDA_inp
delay(Del_hp);
SCL_inp
while(!SCL_IN) ;
delay(Del_hp);
SCL_out
return _byte;
}

#endif

//========================i2c_new.h===================
#ifndef __I2C_NEW_H
#define __I2C_NEW_H

#define I2C_Output PORTB
#define I2C_Input PINB
#define I2C_DDR DDRB
#define SCL_BIT 0x08
#define SDA_BIT 0x10

#define SCL_0 (I2C_Output &= ~SCL_BIT);
#define SCL_1 (I2C_Output |= SCL_BIT);

#define SDA_0 (I2C_Output &= ~SDA_BIT);
#define SDA_1 (I2C_Output |= SDA_BIT);

#define SCL_IN (I2C_Input&SCL_BIT)
#define SDA_IN (I2C_Input&SDA_BIT)

#define SDA_inp (I2C_DDR &= ~SDA_BIT);
#define SDA_out (I2C_DDR |= SDA_BIT);

#define SCL_inp (I2C_DDR &= ~SCL_BIT);
#define SCL_out (I2C_DDR |= SCL_BIT);

#define End_bit(_byte) (_byte&0x80)

#define Timer 0xA2
#define Flash 0xA0

#define Del_hp 4
#define Del_qp 2

void Init_i2c();
void delay(int _del);
void Rep_Start_i2c();
void Start_i2c();
void Stop_i2c();
char Wr_byte_i2c(char _byte);
char Rd_byte_i2c(char _flag);


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru