Driver TWI/I2C - YouTube: Ciência Elétrica
Biblioteca Otimizada para Microcontroladores AVR
Carregando...
Procurando...
Nenhuma entrada encontrado
example2.c
Ir para a documentação desse arquivo.
1
17
18#include <avr/io.h>
19#include <stdio.h>
20#include <avr/interrupt.h>
21#include "twi.h"
22
23/* Protótipos das funções auxiliares */
24void USART_Init(void);
25void USART_Transmite_String(const char *str);
26
33void on_receive(const uint8_t* dados, size_t len);
34
43size_t on_transmit(uint8_t* buffer, size_t max_len);
44
48int main(void) {
49 USART_Init(); // Inicializa UART
50
51 /* Habilita interrupções (necessário para o TWI reagir ao Master) */
52 sei();
53
60
61 /* Registra os callbacks de evento do Slave */
63
64 USART_Transmite_String("Slave pronto - endere�o 0x10\n");
65
66 while (1) {
67 /*
68 * O loop principal permanece livre para outras tarefas.
69 * A comunicação TWI não consome tempo de CPU enquanto o barramento está ocioso.
70 */
71 }
72}
73
77void USART_Init(void){
78 uint16_t ubrr = 103; // 9600 baud para 16MHz
79 UBRR0H = (uint8_t)(ubrr >> 8);
80 UBRR0L = (uint8_t)ubrr;
81 UCSR0B = (1 << TXEN0); // Habilita transmissão
82 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Formato do frame: 8 bits, 1 stop bit, sem paridade
83}
84
85// --- Transmissão de uma string ---
86void USART_Transmite_String(const char *str){
87 while (*str)
88 {
89 while (!(UCSR0A & (1 << UDRE0))); // Aguarda o registrador ficar livre
90 UDR0 = *str++;
91 }
92}
93
97void on_receive(const uint8_t* dados, size_t len) {
98 USART_Transmite_String("Recebi ");
99 for (size_t i = 0; i < len; i++) {
100 char buf[8];
101 sprintf(buf, "%02X ", dados[i]);
103 }
105
106 /* Exemplo de lógica de comando: se receber 0x01, executa ação */
107 if (len >= 1 && dados[0] == 0x01) {
108 USART_Transmite_String("Comando 0x01 recebido!\r\n");
109 }
110}
111
115size_t on_transmit(uint8_t* buffer, size_t max_len) {
116 USART_Transmite_String("Master pediu dados\n");
117
118 /* Exemplo: Enviando uma sequência de bytes fixa */
119 if (max_len >= 5) {
120 buffer[0] = 0x11;
121 buffer[1] = 0x22;
122 buffer[2] = 0x33;
123 buffer[3] = 0x44;
124 buffer[4] = 0x55;
125 return 5; /* Retorna 5 para indicar que há 5 bytes prontos para o envio */
126 }
127
128 return 0; /* Se retornar 0, o hardware enviará um NACK ao Master */
129}
size_t on_transmit(uint8_t *buffer, size_t max_len)
Callback de transmissão (Slave -> Master).
Definição example2.c:115
void USART_Transmite_String(const char *str)
Definição example2.c:86
int main(void)
Ponto de entrada do Slave.
Definição example2.c:48
void on_receive(const uint8_t *dados, size_t len)
Callback de recebimento (Master -> Slave).
Definição example2.c:97
void USART_Init(void)
Inicializa a UART para monitoramento.
Definição example2.c:77
Interface pública do driver TWI/I2C para AVR.
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.
Definição twi.c:103
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_MODE_SLAVE
Definição twi_types.h:18
@ TWI_CLOCK_100KHZ
Definição twi_types.h:25