Готовая библиотека i2c
This commit is contained in:
parent
be407af3b7
commit
cbe641cb48
22
MyLCD.h
Normal file
22
MyLCD.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
#ifndef MYLCD_H_
|
||||||
|
#define MYLCD_H_
|
||||||
|
|
||||||
|
|
||||||
|
// ïîäêëþ÷àåì âñå ëèáû
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <compat/twi.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "lcdpcf8574.h"
|
||||||
|
#include "pcf8574.h"
|
||||||
|
#include "i2cmaster.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
42
i2cmaster.h
Normal file
42
i2cmaster.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#ifndef _I2CMASTER_H
|
||||||
|
#define _I2CMASTER_H
|
||||||
|
|
||||||
|
// флаг, отвечающий за чтение данных по i2c
|
||||||
|
#define I2C_READ 1
|
||||||
|
|
||||||
|
// флаг, отвечающий за отправку данных по i2c
|
||||||
|
#define I2C_WRITE 0
|
||||||
|
|
||||||
|
// частота тактирования линии в Герцах
|
||||||
|
#define SCL_CLOCK 100000L
|
||||||
|
|
||||||
|
// инициализация интерфейса
|
||||||
|
void i2c_init(void);
|
||||||
|
|
||||||
|
// передача условия СТОП на шину
|
||||||
|
void i2c_stop(void);
|
||||||
|
|
||||||
|
// передача условия СТАРТ на шину
|
||||||
|
unsigned char i2c_start(unsigned char addr);
|
||||||
|
|
||||||
|
// повторный старт(перезапуск)
|
||||||
|
unsigned char i2c_rep_start(unsigned char addr);
|
||||||
|
|
||||||
|
// ждем, если устрой-во занято, а потом передаем условие СТАРТ на шину
|
||||||
|
void i2c_start_wait(unsigned char addr);
|
||||||
|
|
||||||
|
// отправка данных
|
||||||
|
unsigned char i2c_write(unsigned char data);
|
||||||
|
|
||||||
|
// читаем данные и продолжаем вещание
|
||||||
|
unsigned char i2c_readAck(void);
|
||||||
|
|
||||||
|
// читаем данные и после их получения передаем услови СТОП
|
||||||
|
unsigned char i2c_readNak(void);
|
||||||
|
|
||||||
|
// читаем данные с шины
|
||||||
|
unsigned char i2c_read(unsigned char ack);
|
||||||
|
|
||||||
|
// выбираем какой варинт чтения данных будет
|
||||||
|
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
|
||||||
|
#endif
|
117
twimaster.cpp
Normal file
117
twimaster.cpp
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
#include "MyLCD.h"
|
||||||
|
|
||||||
|
// инициализация интерфейса i2c
|
||||||
|
void i2c_init(void)
|
||||||
|
{
|
||||||
|
// предделитель тактовой частоты равен 1
|
||||||
|
TWSR = 0;
|
||||||
|
// рассчет скорости передачи данных
|
||||||
|
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// передача условия СТАРТ на шину
|
||||||
|
unsigned char i2c_start(unsigned char address)
|
||||||
|
{
|
||||||
|
uint8_t twst;
|
||||||
|
|
||||||
|
// отправка условия СТАРТ
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||||
|
// ожидание завершения передачи условия СТАРТ
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
// проверка значений регистра
|
||||||
|
twst = TW_STATUS & 0xF8;
|
||||||
|
if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
|
||||||
|
// отправка адреса устрой-ва
|
||||||
|
TWDR = address;
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
|
// ожидание ответа от ведомого уст-ва
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
// проверка полученных значений
|
||||||
|
twst = TW_STATUS & 0xF8;
|
||||||
|
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ждем, если устрой-во занято, а потом передаем условие СТАРТ на шину
|
||||||
|
void i2c_start_wait(unsigned char address)
|
||||||
|
{
|
||||||
|
uint8_t twst;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
// отправка условия СТАРТ
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||||
|
// ожидание завершения передачи условия СТАРТ
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
// проверка значений регистра
|
||||||
|
twst = TW_STATUS & 0xF8;
|
||||||
|
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
|
||||||
|
// отправка адреса устрой-ва
|
||||||
|
TWDR = address;
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
|
// ожидание ответа от ведомого уст-ва
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
// проверка занято ли ведомое уст-во
|
||||||
|
twst = TW_STATUS & 0xF8;
|
||||||
|
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
|
||||||
|
{
|
||||||
|
// устройство занято, отправьте условие остановки для прекращения операции записи
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||||
|
// ждем освобождения шины
|
||||||
|
while(TWCR & (1<<TWSTO));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// тупа повторяем условие СТАРТ
|
||||||
|
unsigned char i2c_rep_start(unsigned char address)
|
||||||
|
{
|
||||||
|
return i2c_start(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
// передача условия СТОП на шину
|
||||||
|
void i2c_stop(void)
|
||||||
|
{
|
||||||
|
// отправка условия СТОП
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||||
|
// ждем выполнения условия остановки
|
||||||
|
while(TWCR & (1<<TWSTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
// отправка данных, если функция вернет 0, то все успешно, иначе нет
|
||||||
|
unsigned char i2c_write( unsigned char data )
|
||||||
|
{
|
||||||
|
uint8_t twst;
|
||||||
|
|
||||||
|
// отправляем данные на уст-во
|
||||||
|
TWDR = data;
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
|
// ждем завершения передачи
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
// записываем ответ от ведомого уст-ва
|
||||||
|
twst = TW_STATUS & 0xF8;
|
||||||
|
if( twst != TW_MT_DATA_ACK) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// читаем данные и продолжаем вещание
|
||||||
|
unsigned char i2c_readAck(void)
|
||||||
|
{
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
|
||||||
|
return TWDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// читаем данные и после их получения передаем услови СТОП
|
||||||
|
unsigned char i2c_readNak(void)
|
||||||
|
{
|
||||||
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
|
while(!(TWCR & (1<<TWINT)));
|
||||||
|
|
||||||
|
return TWDR;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user