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 */
24
void
USART_Init
(
void
);
25
void
USART_Transmite_String
(
const
char
*str);
26
33
void
on_receive
(
const
uint8_t* dados,
size_t
len);
34
43
size_t
on_transmit
(uint8_t* buffer,
size_t
max_len);
44
48
int
main
(
void
) {
49
USART_Init
();
// Inicializa UART
50
51
/* Habilita interrupções (necessário para o TWI reagir ao Master) */
52
sei();
53
59
twi_init
(
TWI_MODE_SLAVE
, 0x10,
TWI_CLOCK_100KHZ
);
60
61
/* Registra os callbacks de evento do Slave */
62
twi_slave_register_callbacks
(
on_receive
,
on_transmit
);
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
77
void
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 ---
86
void
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
97
void
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]);
102
USART_Transmite_String
(buf);
103
}
104
USART_Transmite_String
(
"\r\n"
);
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
115
size_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
}
on_transmit
size_t on_transmit(uint8_t *buffer, size_t max_len)
Callback de transmissão (Slave -> Master).
Definição
example2.c:115
USART_Transmite_String
void USART_Transmite_String(const char *str)
Definição
example2.c:86
main
int main(void)
Ponto de entrada do Slave.
Definição
example2.c:48
on_receive
void on_receive(const uint8_t *dados, size_t len)
Callback de recebimento (Master -> Slave).
Definição
example2.c:97
USART_Init
void USART_Init(void)
Inicializa a UART para monitoramento.
Definição
example2.c:77
twi.h
Interface pública do driver TWI/I2C para AVR.
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.
Definição
twi.c:103
twi_init
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
@ TWI_MODE_SLAVE
Definição
twi_types.h:18
TWI_CLOCK_100KHZ
@ TWI_CLOCK_100KHZ
Definição
twi_types.h:25
examples
example2.c
Gerado por
1.16.1 | Desenvolvido por
Tiago Henrique dos Santos - Ciência Elétrica