Driver TWI/I2C - YouTube: Ciência Elétrica
Biblioteca Otimizada para Microcontroladores AVR
Carregando...
Procurando...
Nenhuma entrada encontrado
example3.c
Ir para a documentação desse arquivo.
1
19
20#include <avr/io.h>
21#include <util/delay.h>
22#include <stdio.h>
23#include <avr/interrupt.h>
24#include "twi.h"
25
26/* Protótipos de funções de auxílio */
27void USART_Init(void);
28void USART_Transmite_String(const char *str);
29void uart_puthex8(uint8_t val);
30
37void on_complete(TWI_Status_t st, const uint8_t* data, size_t len);
38
42int main(void) {
43 /* Inicializa UART para monitoramento via Terminal Serial */
44 USART_Init();
45 USART_Transmite_String("\r\n=== Teste Repeated Start - MPU6050 ===\r\n");
46
47 /* Habilita interrupções globais - Essencial antes de twi_init */
48 sei();
49
50 /* Inicializa o barramento TWI a 100 kHz */
52 USART_Transmite_String("Falha ao inicializar TWI!\r\n");
53 while (1);
54 }
55
56 /* Registra o callback de conclusão */
57 twi_master_register_callbacks(on_complete, NULL); // NULL = sem callback separado para erro
58
60 uint8_t reg_addr = 0x75;
61
63 uint8_t who_am_i[1] = {0};
64
70 0x68,
71 &reg_addr,
72 1,
73 who_am_i_val,
74 1
75 );
76
77 // A partir daqui o programa continua normalmente
78 // O callback on_complete ser� chamado pela ISR quando terminar
79
80 while (1) {
81 /* O sistema permanece livre; o resultado será impresso pelo callback. */
82 _delay_ms(500);
83 }
84}
85
89void USART_Init(void){
90 uint16_t ubrr = 103; // 9600 bps @ 16MHz
91 UBRR0H = (uint8_t)(ubrr >> 8);
92 UBRR0L = (uint8_t)ubrr;
93 UCSR0B = (1 << TXEN0); // Habilita transmissão
94 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Formato do frame: 8 bits, 1 stop bit, sem paridade
95}
96
97void USART_Transmite_String(const char *str){
98 while (*str)
99 {
100 while (!(UCSR0A & (1 << UDRE0))); // Aguarda o registrador ficar livre
101 UDR0 = *str++;
102 }
103}
104
109void uart_puthex8(uint8_t val) {
110 char buf[5];
111 sprintf(buf, "%02X ", val);
113}
114
118void on_complete(TWI_Status_t st, const uint8_t* data, size_t len) {
119 if (st == TWI_OK) {
120 USART_Transmite_String("Sucesso! WHO_AM_I = ");
121 if (len >= 1) {
122 uart_puthex8(data[0]);
123 }
125 } else {
126 USART_Transmite_String("Erro na transa��o: ");
127 if (st == TWI_ERROR_TIMEOUT) USART_Transmite_String("Timeout");
128 else if (st == TWI_ERROR_NACK) USART_Transmite_String("NACK");
129 else if (st == TWI_ERROR_BUS_BUSY) USART_Transmite_String("Bus Busy");
130 else USART_Transmite_String("Outro erro");
132 }
133}
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
void USART_Transmite_String(const char *str)
Definição example3.c:97
int main(void)
Função principal para o teste do MPU6050.
Definição example3.c:42
void USART_Init(void)
Inicializa a UART para depuração.
Definição example3.c:89
void uart_puthex8(uint8_t val)
Converte um byte em Hexadecimal e envia via UART.
Definição example3.c:109
void on_complete(TWI_Status_t st, const uint8_t *data, size_t len)
Callback chamado ao fim da transação combinada.
Definição example3.c:118
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_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_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.
Definição twi.c:361
@ 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