Driver TWI/I2C - YouTube: Ciência Elétrica
Biblioteca Otimizada para Microcontroladores AVR
Carregando...
Procurando...
Nenhuma entrada encontrado
Referência do Arquivo twi.c

Implementação do Driver TWI/I2C para microcontroladores AVR. Mais...

#include "twi.h"
#include "twi_internal.h"
#include "twi_config.h"
#include <stddef.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
Gráfico de dependência de inclusões para twi.c:

Ir para o código-fonte desse arquivo.

Definições e Macros

#define TWI_TIMEOUT_LIMIT_DEFAULT   200
 Limite padrão de timeout para evitar travamento do barramento.

Funções

static uint8_t twi_calc_twbr (TWI_Clock_t clock)
 Calcula o valor do registrador TWBR baseado na frequência de CPU e SCL desejada.
TWI_Status_t twi_init (TWI_Mode_t mode, uint8_t address, TWI_Clock_t clock)
 Inicializa o módulo TWI.
void twi_deinit (void)
 Desabilita o módulo TWI e reseta o estado da transação.
void twi_master_register_callbacks (TWI_Master_Complete_Callback_t on_complete, TWI_Error_Callback_t on_error)
 Registra os callbacks de eventos para o modo Master.
void twi_slave_register_callbacks (TWI_Slave_Receive_Callback_t on_receive, TWI_Slave_Transmit_Callback_t on_transmit)
 Registra os callbacks de eventos para o modo Slave.
TWI_Status_t twi_master_start_probe (uint8_t slave_address)
 Realiza um "ping" no endereço para verificar se o Slave está presente.
 ISR (TWI_vect)
 Vetor de Interrupção TWI.
TWI_Status_t twi_master_start_write (uint8_t slave_address, const uint8_t *data, size_t length)
 Inicia envio assíncrono de dados como Master.
TWI_Status_t twi_master_start_read (uint8_t slave_address, uint8_t *data, size_t length)
 Inicia leitura assíncrona de dados como Master.
TWI_Status_t twi_master_start_write_read (uint8_t slave_address, const uint8_t *write_data, size_t write_length, uint8_t *read_data, size_t read_length)
 Inicia uma transação combinada (Escrita seguida de Leitura) com Repeated Start.
void twi_handle_state (void)
 Gerenciador principal da Máquina de Estados.
TWI_Status_t twi_slave_process (void)
 Processa eventos pendentes no Slave.
TWI_BusState_t twi_get_bus_status (void)
 Retorna o estado atual do barramento.
TWI_Status_t twi_master_write_read (uint8_t slave_addr, const uint8_t *tx_data, size_t tx_len, uint8_t *rx_data, size_t rx_len)
 Inicia uma transação combinada de escrita seguida de leitura (Repeated Start).

Variáveis

static uint8_t slave_internal_rx_buffer [TWI_RX_BUFFER_SIZE]
 Buffer interno para recepção de dados no modo Slave.
static uint8_t slave_internal_tx_buffer [TWI_RX_BUFFER_SIZE]
 Buffer interno para transmissão de dados no modo Slave.
static size_t slave_rx_idx = 0
 Índice atual do buffer de recepção do Slave.
volatile TWI_Transaction_t g_twi_txn = { .state = TWI_STATE_IDLE }
 Estrutura global que armazena o estado da transação atual. Marcada como volatile pois é modificada dentro da ISR.
Callbacks

Ponteiros para funções de retorno de chamada do usuário.

static TWI_Master_Complete_Callback_t master_complete_cb = NULL
static TWI_Error_Callback_t error_cb = NULL
static TWI_Slave_Receive_Callback_t slave_receive_cb = NULL
static TWI_Slave_Transmit_Callback_t slave_transmit_cb = NULL

Descrição detalhada

Implementação do Driver TWI/I2C para microcontroladores AVR.

Autor
Seu Nome / Empresa
Data
2024

Este arquivo contém a lógica da máquina de estados para operações Master (Transmissor/Receptor) e Slave (Transmissor/Receptor) utilizando interrupções.

Definição no arquivo twi.c.

Definições e macros

◆ TWI_TIMEOUT_LIMIT_DEFAULT

#define TWI_TIMEOUT_LIMIT_DEFAULT   200

Limite padrão de timeout para evitar travamento do barramento.

Aproximadamente 200 interrupções sem progresso (100-200ms em 100kHz).

Definição na linha 21 do arquivo twi.c.

Funções

◆ ISR()

ISR ( TWI_vect )

Vetor de Interrupção TWI.

Gerencia a máquina de estados complexa para Master e Slave, tratando condições de START, ACK/NACK, recepção e transmissão de dados.

Definição na linha 129 do arquivo twi.c.

◆ twi_calc_twbr()

uint8_t twi_calc_twbr ( TWI_Clock_t clock)
static

Calcula o valor do registrador TWBR baseado na frequência de CPU e SCL desejada.

Parâmetros
clockEnumeração TWI_Clock_t (100kHz ou 400kHz).
Retorna
uint8_t Valor calculado para o registrador TWBR.

Definição na linha 59 do arquivo twi.c.

Esse é o diagrama das funções que utilizam essa função:

◆ twi_deinit()

void twi_deinit ( void )

Desabilita o módulo TWI e reseta o estado da transação.

Desinicializa o módulo TWI, desligando o hardware e interrupções.

Definição na linha 90 do arquivo twi.c.

◆ twi_get_bus_status()

TWI_BusState_t twi_get_bus_status ( void )

Retorna o estado atual do barramento.

Retorna
TWI_BusState_t Estado atual.

Definição na linha 390 do arquivo twi.c.

◆ twi_handle_state()

void twi_handle_state ( void )

Gerenciador principal da Máquina de Estados.

Chamado dentro da interrupção para decidir o próximo passo com base no status do hardware.

Definição na linha 381 do arquivo twi.c.

◆ twi_init()

TWI_Status_t twi_init ( TWI_Mode_t mode,
uint8_t address,
TWI_Clock_t clock )

Inicializa o módulo TWI.

Parâmetros
modeModo de operação (TWI_MODE_MASTER ou TWI_MODE_SLAVE).
addressEndereço Slave (0-127). Ignorado no modo Master.
clockFrequência do barramento (TWI_Clock_t).
Retorna
TWI_Status_t Status da operação.

Definição na linha 65 do arquivo twi.c.

Este é o diagrama das funções utilizadas por essa função:
Esse é o diagrama das funções que utilizam essa função:

◆ twi_master_register_callbacks()

void twi_master_register_callbacks ( TWI_Master_Complete_Callback_t on_complete,
TWI_Error_Callback_t on_error )

Registra os callbacks de eventos para o modo Master.

Parâmetros
on_completeFunção chamada após sucesso.
on_errorFunção chamada em caso de falha ou NACK.

Definição na linha 97 do arquivo twi.c.

Este é o diagrama das funções utilizadas por essa função:
Esse é o diagrama das funções que utilizam essa função:

◆ twi_master_start_probe()

TWI_Status_t twi_master_start_probe ( uint8_t slave_address)

Realiza um "ping" no endereço para verificar se o Slave está presente.

Parâmetros
slave_addressEndereço a ser testado.
Retorna
TWI_Status_t TWI_OK se o comando de START foi enviado.

Definição na linha 109 do arquivo twi.c.

◆ twi_master_start_read()

TWI_Status_t twi_master_start_read ( uint8_t slave_address,
uint8_t * data,
size_t length )

Inicia leitura assíncrona de dados como Master.

Parâmetros
slave_addressEndereço do dispositivo Slave.
dataBuffer onde os dados lidos serão armazenados.
lengthNúmero de bytes a serem lidos.
Retorna
TWI_Status_t TWI_OK se a leitura foi disparada.

Definição na linha 348 do arquivo twi.c.

Esse é o diagrama das funções que utilizam essa função:

◆ twi_master_start_write()

TWI_Status_t twi_master_start_write ( uint8_t slave_address,
const uint8_t * data,
size_t length )

Inicia envio assíncrono de dados como Master.

Observação
Operação não-bloqueante. O callback de conclusão será chamado na ISR.
Parâmetros
slave_addressEndereço de 7 bits do dispositivo destino.
dataPonteiro para o buffer de dados a serem enviados.
lengthQuantidade de bytes no buffer.
Retorna
TWI_OK se iniciado com sucesso, TWI_ERROR_BUS_BUSY se o barramento estiver ocupado.

Definição na linha 332 do arquivo twi.c.

Esse é o diagrama das funções que utilizam essa função:

◆ twi_master_start_write_read()

TWI_Status_t twi_master_start_write_read ( uint8_t slave_address,
const uint8_t * write_data,
size_t write_length,
uint8_t * read_data,
size_t read_length )

Inicia uma transação combinada (Escrita seguida de Leitura) com Repeated Start.

Parâmetros
slave_addressEndereço do Slave.
write_dataBuffer com dados de escrita (ex: endereço de registrador).
write_lengthTamanho da escrita.
read_dataBuffer para armazenar o retorno do Slave.
read_lengthTamanho da leitura esperada.
Retorna
TWI_Status_t Status de início da transação.

Definição na linha 361 do arquivo twi.c.

Esse é o diagrama das funções que utilizam essa função:

◆ twi_master_write_read()

TWI_Status_t twi_master_write_read ( uint8_t slave_addr,
const uint8_t * tx_data,
size_t tx_len,
uint8_t * rx_data,
size_t rx_len )

Inicia uma transação combinada de escrita seguida de leitura (Repeated Start).

Versão síncrona/bloqueante de escrita seguida de leitura.

Esta função configura o hardware para enviar uma sequência de bytes e, imediatamente após (sem liberar o barramento), inicia a leitura de uma quantidade específica de bytes. É o método padrãoo para leitura de registradores em dispositivos como o DS3231.

Parâmetros
slave_addrEndereço de 7 bits do dispositivo escravo (ex: 0x68).
tx_dataPonteiro para o buffer de dados a serem enviados (ex: endereço do registrador).
tx_lenQuantidade de bytes a transmitir.
rx_dataPonteiro para o buffer onde os dados recebidos serão armazenados.
rx_lenQuantidade de bytes a receber.
Retorna
TWI_OK se a transação foi iniciada com sucesso.
TWI_ERROR_BUS_BUSY se o módulo TWI já estiver processando outra transação.

Definição na linha 418 do arquivo twi.c.

◆ twi_slave_process()

TWI_Status_t twi_slave_process ( void )

Processa eventos pendentes no Slave.

Observação
Deve ser chamada periodicamente no loop principal se não houver processamento direto na ISR.
Retorna
TWI_Status_t Status do processamento.

Definição na linha 385 do arquivo twi.c.

◆ twi_slave_register_callbacks()

void twi_slave_register_callbacks ( TWI_Slave_Receive_Callback_t on_receive,
TWI_Slave_Transmit_Callback_t on_transmit )

Registra os callbacks de eventos para o modo Slave.

Parâmetros
on_receiveChamado quando o Master envia dados para este endereço.
on_transmitChamado quando o Master solicita dados deste endereço.

Definição na linha 103 do arquivo twi.c.

Este é o diagrama das funções utilizadas por essa função:
Esse é o diagrama das funções que utilizam essa função:

Variáveis

◆ error_cb

TWI_Error_Callback_t error_cb = NULL
static

Definição na linha 40 do arquivo twi.c.

◆ g_twi_txn

volatile TWI_Transaction_t g_twi_txn = { .state = TWI_STATE_IDLE }

Estrutura global que armazena o estado da transação atual. Marcada como volatile pois é modificada dentro da ISR.

Instância global da transação ativa.

Definição na linha 34 do arquivo twi.c.

◆ master_complete_cb

TWI_Master_Complete_Callback_t master_complete_cb = NULL
static

Definição na linha 39 do arquivo twi.c.

◆ slave_internal_rx_buffer

uint8_t slave_internal_rx_buffer[TWI_RX_BUFFER_SIZE]
static

Buffer interno para recepção de dados no modo Slave.

Definição na linha 24 do arquivo twi.c.

◆ slave_internal_tx_buffer

uint8_t slave_internal_tx_buffer[TWI_RX_BUFFER_SIZE]
static

Buffer interno para transmissão de dados no modo Slave.

Definição na linha 26 do arquivo twi.c.

◆ slave_receive_cb

TWI_Slave_Receive_Callback_t slave_receive_cb = NULL
static

Definição na linha 41 do arquivo twi.c.

◆ slave_rx_idx

size_t slave_rx_idx = 0
static

Índice atual do buffer de recepção do Slave.

Definição na linha 28 do arquivo twi.c.

◆ slave_transmit_cb

TWI_Slave_Transmit_Callback_t slave_transmit_cb = NULL
static

Definição na linha 42 do arquivo twi.c.