|
Driver TWI/I2C - YouTube: Ciência Elétrica
Biblioteca Otimizada para Microcontroladores AVR
|
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>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 |
Implementação do Driver TWI/I2C para microcontroladores AVR.
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.
| #define TWI_TIMEOUT_LIMIT_DEFAULT 200 |
| ISR | ( | TWI_vect | ) |
|
static |
Calcula o valor do registrador TWBR baseado na frequência de CPU e SCL desejada.
| clock | Enumeração TWI_Clock_t (100kHz ou 400kHz). |
Definição na linha 59 do arquivo twi.c.
| void twi_deinit | ( | void | ) |
| TWI_BusState_t twi_get_bus_status | ( | void | ) |
Retorna o estado atual do barramento.
| void twi_handle_state | ( | void | ) |
| TWI_Status_t twi_init | ( | TWI_Mode_t | mode, |
| uint8_t | address, | ||
| TWI_Clock_t | clock ) |
Inicializa o módulo TWI.
| mode | Modo de operação (TWI_MODE_MASTER ou TWI_MODE_SLAVE). |
| address | Endereço Slave (0-127). Ignorado no modo Master. |
| clock | Frequência do barramento (TWI_Clock_t). |
Definição na linha 65 do arquivo twi.c.
| 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.
| on_complete | Função chamada após sucesso. |
| on_error | Função chamada em caso de falha ou NACK. |
Definição na linha 97 do arquivo twi.c.
| TWI_Status_t twi_master_start_probe | ( | uint8_t | slave_address | ) |
Realiza um "ping" no endereço para verificar se o Slave está presente.
| slave_address | Endereço a ser testado. |
| 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.
| slave_address | Endereço do dispositivo Slave. |
| data | Buffer onde os dados lidos serão armazenados. |
| length | Número de bytes a serem lidos. |
Definição na linha 348 do arquivo twi.c.
| 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.
| slave_address | Endereço de 7 bits do dispositivo destino. |
| data | Ponteiro para o buffer de dados a serem enviados. |
| length | Quantidade de bytes no buffer. |
Definição na linha 332 do arquivo twi.c.
| 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.
| slave_address | Endereço do Slave. |
| write_data | Buffer com dados de escrita (ex: endereço de registrador). |
| write_length | Tamanho da escrita. |
| read_data | Buffer para armazenar o retorno do Slave. |
| read_length | Tamanho da leitura esperada. |
Definição na linha 361 do arquivo twi.c.
| 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.
| slave_addr | Endereço de 7 bits do dispositivo escravo (ex: 0x68). |
| tx_data | Ponteiro para o buffer de dados a serem enviados (ex: endereço do registrador). |
| tx_len | Quantidade de bytes a transmitir. |
| rx_data | Ponteiro para o buffer onde os dados recebidos serão armazenados. |
| rx_len | Quantidade de bytes a receber. |
| TWI_Status_t twi_slave_process | ( | void | ) |
Processa eventos pendentes no Slave.
| 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.
| on_receive | Chamado quando o Master envia dados para este endereço. |
| on_transmit | Chamado quando o Master solicita dados deste endereço. |
Definição na linha 103 do arquivo twi.c.
|
static |
| volatile TWI_Transaction_t g_twi_txn = { .state = TWI_STATE_IDLE } |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |