Driver TWI/I2C - YouTube: Ciência Elétrica
Biblioteca Otimizada para Microcontroladores AVR
Carregando...
Procurando...
Nenhuma entrada encontrado
example1.c
Ir para a documentação desse arquivo.
1
16
17#define F_CPU 16000000UL
18#include <avr/io.h>
19#include <util/delay.h>
20#include <stdio.h>
21#include <avr/interrupt.h>
22#include "twi.h"
23
24/* Protótipos de funções locais */
25void USART_Init(void);
26void USART_Transmite_String(const char *str);
27
40void on_complete(TWI_Status_t st, const uint8_t* data, size_t len);
41
45int main(void) {
46 /* Inicialização do sistema */
47 USART_Init();
48 USART_Transmite_String("Inicializando...");
49 /* Habilita interrupções globais (obrigatório para o funcionamento do TWI) */
50 sei();
51
52 /* Inicializa o TWI como Master a 100kHz */
54
55 /* Registra o callback de conclusão */
57
58 /*
59 * Passo 1: Enviar 3 bytes para o Slave 0x10.
60 * A função retorna imediatamente; o envio ocorre via interrupção.
61 */
62 uint8_t dados[] = {0xAA, 0xBB, 0xCC};
63 twi_master_start_write(0x10, dados, 3);
64
65 _delay_ms(1000); // Apenas para separar os testes visualmente
66
67 /*
68 * Passo 2: Ler 4 bytes do Slave 0x10.
69 * O buffer deve permanecer válido até que o callback seja chamado.
70 */
71 uint8_t buffer[4] = {0};
72 twi_master_start_read(0x10, buffer, 4);
73
74 while (1) {
75 /* O processamento de dados acontece de forma reativa no callback on_complete */
76 }
77}
78
82void USART_Init(void){
83 uint16_t ubrr = 103;// Para 16MHz e 9600 baud
84 UBRR0H = (uint8_t)(ubrr >> 8);
85 UBRR0L = (uint8_t)ubrr;
86 UCSR0B = (1 << TXEN0); // Habilita transmissão
87 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Formato do frame: 8 bits, 1 stop bit, sem paridade
88}
89
94void USART_Transmite_String(const char *str){
95 while (*str)
96 {
97 while (!(UCSR0A & (1 << UDRE0))); // Aguarda o registrador ficar livre
98 UDR0 = *str++;
99 }
100}
101
105void on_complete(TWI_Status_t st, const uint8_t* data, size_t len) {
106 if (st == TWI_OK) {
107 USART_Transmite_String("Sucesso! ");
108
109 /* Verifica se há dados lidos para exibir */
110 if (data && len > 0) {
111 USART_Transmite_String("Lidos: ");
112 for (size_t i = 0; i < len; i++) {
113 char buf[8];
114 sprintf(buf, "%02X ", data[i]);
116 }
117 }
119 } else {
120 /* Tratamento de erros */
121 USART_Transmite_String("Erro: ");
122 if (st == TWI_ERROR_TIMEOUT) USART_Transmite_String("Timeout");
123 else if (st == TWI_ERROR_NACK) USART_Transmite_String("NACK");
124 else if (st == TWI_ERROR_BUS_BUSY) USART_Transmite_String("Bus Busy");
125 else USART_Transmite_String("Outro");
127 }
128}
void USART_Transmite_String(const char *str)
Envia uma string via UART0.
Definição example1.c:94
int main(void)
Ponto de entrada principal da aplicação.
Definição example1.c:45
void USART_Init(void)
Inicializa a UART0 para 9600 bps (8N1).
Definição example1.c:82
void on_complete(TWI_Status_t st, const uint8_t *data, size_t len)
Callback de conclusão para transações Master.
Definição example1.c:105
Interface pública do driver TWI/I2C para AVR.
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.
Definição twi.c:97
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.
Definição twi.c:348
TWI_Status_t twi_init(TWI_Mode_t mode, uint8_t address, TWI_Clock_t clock)
Inicializa o módulo TWI.
Definição twi.c:65
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.
Definição twi.c:332
@ TWI_MODE_MASTER
Definição twi_types.h:17
TWI_Status_t
Códigos de status e erro para operações TWI.
Definição twi_types.h:32
@ TWI_OK
Definição twi_types.h:33
@ TWI_ERROR_BUS_BUSY
Definição twi_types.h:35
@ TWI_ERROR_TIMEOUT
Definição twi_types.h:37
@ TWI_ERROR_NACK
Definição twi_types.h:34
@ TWI_CLOCK_100KHZ
Definição twi_types.h:25