Давно уже написал, а выложить все как-то влом было. Но если вдруг, кому потребуется, простенькая библиотечка для работы с Two-Wire Interface (TWI, он же I2C) на AVR вообще и ATMega328p (та самая, которая в arduino nano v3 стоит) в частности.
Пользоваться проще некуда, подглядеть в libtwi.h всегда можно.
Скачать на гитхабе github.com/bevice/libtwi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include "main.h" #include "libtwi.h" #include <util/delay.h> void setup() { twi_init(); DDRB |= _BV(PB5); // включим PB5 на выход, на Arduino Nano там светодиодик } #define DATA_SIZE 10 static uint8_t data[DATA_SIZE] ={0}; void twi_cb(uint8_t status){ if(status!= TWI_STATUS_ERROR) // если все прочиталось - перевернем светодиод DDRB ^= _BV(PB5); } int main() { setup(); while (1) { // для 24CXX при записи передается адрес и следом данные. uint8_t buff[] = {0x10,1,2,3,4,5}; // передаем buff в железку с адресом 0xA0, // как закончим передавать - дергаем twi_cb twi_transmit_data(0xA0, sizeof(buff), buff, &twi_cb); _delay_ms(1000); // читаем DATA_SIZE байт из железки // с адресом 0xA0 начиная с регистра 0x10 // как в буффер data, как дочитаем // - попадем в коллбек twi_cb с соответствующим статусом twi_receive_data_adr8(0xA0, 0x10, DATA_SIZE, data, &twi_cb); _delay_ms(1000); } } |