#include "header.h" /* before init : 11111000 after init : 11111000 after start : 1000 after SLA+W : 11000 1 : 11000 2 : 11000 3 : 11000 4 : 11000 5 : 11000 6 : 11000 7 : 11000 8 : 11000 9 : 11000 10 : 11000 20 : 11000 30 : 11000 40 : 11000 50 : 11000 60 : 11000 70 : 11000 80 : 11000 90 : 11000 100 : 11000 110 : 11000 120 : 11000 130 : 11000 140 : 11000 150 : 11000 160 : 11000 170 : 11000 180 : 11000 190 : 11000 200 : 11000 1200 : 11000 after stop : 11111000 */ /* before init : 11111000 after init : 11111000 before start : 11111000 after start : 1000 waiting 200ms... : 1000 done waiting : 1000 send SLA+W : 1000 after SLA+W : 11000 waiting 10ms... : 11000 done waiting : 11000 send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 status ? 0 : 101000 status ? 10 : 101000 status ? 20 : 101000 status ? 30 : 101000 status ? 40 : 101000 status ? 50 : 101000 status ? 60 : 101000 status ? 70 : 101000 status ? 80 : 101000 status ? 90 : 101000 status ? 100 : 101000 status ? 110 : 101000 status ? 120 : 101000 status ? 130 : 101000 after stop : 11111000 */ /* before init : 11111000 no state information available after init : 11111000 before start : 11111000 after start : 1000 start condition transmitted waiting 200ms... : 1000 done waiting : 1000 send SLA+W : 1000 after SLA+W : 11000 SLA+W transmitted, ACK received waiting 10ms... : 11000 done waiting : 11000 send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 data transmitted, ACK received send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 send repeat start : 101000 after repeat start : 10000 repeated start condition transmitted send SLA+R : 10000 after SLA+R : 1000000 SLA+R transmitted, ACK received status ? 0 : 1000000 status ? 10 : 1000000 status ? 20 : 1000000 status ? 30 : 1000000 status ? 40 : 1000000 status ? 50 : 1000000 status ? 60 : 1000000 status ? 70 : 1000000 status ? 80 : 1000000 status ? 90 : 1000000 status ? 100 : 1000000 status ? 110 : 1000000 status ? 120 : 1000000 status ? 130 : 1000000 after stop : 11111000 */ /* before init : 11111000 no state information available after init : 11111000 before start : 11111000 after start : 1000 start condition transmitted send 0x71 to get a byte of status word : 1000 after 0x71 : 1000000 SLA+R transmitted, ACK received waiting 200ms... : 1000000 done waiting : 1000000 send 0x71 to get a byte of status word : 1000000 after 0x71 : 1011000 data received, NACK returned send SLA+W : 1011000 after SLA+W : 1011000 waiting 10ms... : 1011000 done waiting : 1011000 send 0xAC (trigger measurement) : 1011000 after 0xAC : 11111000 no state information available send parameter 1st byte 0x33 : 11111000 after 0x33 : 11111000 send parameter 2nd byte 0x00 : 11111000 after 0x00 : 11111000 send repeat start : 11111000 after repeat start : 1000 start condition transmitted send SLA+R : 1000 after SLA+R : 1000000 SLA+R transmitted, ACK received status ? 0 : 1000000 status ? 10 : 1000000 status ? 20 : 1000000 status ? 30 : 1000000 status ? 40 : 1000000 status ? 50 : 1000000 status ? 60 : 1000000 status ? 70 : 1000000 status ? 80 : 1000000 status ? 90 : 1000000 status ? 100 : 1000000 status ? 110 : 1000000 status ? 120 : 1000000 status ? 130 : 1000000 after stop : 11111000 */ /* init i2c : 11111000 no state information available after init : 11111000 start transmission : 11111000 after start : 1000 start condition transmitted send SLA+W : 1000 after SLA+W : 11000 SLA+W transmitted, ACK received waiting 10ms... : 11000 done waiting : 11000 send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 data transmitted, ACK received send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 send repeat start : 101000 after repeat start : 10000 repeated start condition transmitted send SLA+R : 10000 after SLA+R : 1000000 SLA+R transmitted, ACK received status ? 0 : 1000000 status ? 10 : 1000000 status ? 20 : 1000000 status ? 30 : 1000000 status ? 40 : 1000000 status ? 50 : 1000000 status ? 60 : 1000000 status ? 70 : 1000000 status ? 80 : 1000000 status ? 90 : 1000000 status ? 100 : 1000000 status ? 110 : 1000000 status ? 120 : 1000000 status ? 130 : 1000000 send stop : 1000000 after stop : 11111000 no state information available */ /* init i2c : 11111000 no state information available after init : 11111000 start transmission : 11111000 after start : 1000 start condition transmitted send SLA+W : 1000 after SLA+W : 11000 SLA+W transmitted, ACK received send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 data transmitted, ACK received send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 send repeat start : 101000 after repeat start : 10000 repeated start condition transmitted send SLA+R : 10000 after SLA+R : 1000000 SLA+R transmitted, ACK received status ? 0 : 1000000 status ? 10 : 1000000 status ? 20 : 1000000 status ? 30 : 1000000 status ? 40 : 1000000 status ? 50 : 1000000 status ? 60 : 1000000 status ? 70 : 1000000 status ? 80 : 1000000 status ? 90 : 1000000 status ? 100 : 1000000 status ? 110 : 1000000 status ? 120 : 1000000 status ? 130 : 1000000 send stop : 1000000 after stop : 11111000 no state information available */ /* init i2c : 11111000 no state information available after init : 11111000 start transmission : 11111000 after start : 1000 start condition transmitted send SLA+W : 1000 after SLA+W : 11000 SLA+W transmitted, ACK received send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 data transmitted, ACK received send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 send SLA+R : 101000 after SLA+R : 110000 data transmitted, NACK received status ? 0 : 110000 status ? 10 : 110000 status ? 20 : 110000 status ? 30 : 110000 status ? 40 : 110000 status ? 50 : 110000 status ? 60 : 110000 status ? 70 : 110000 status ? 80 : 110000 status ? 90 : 110000 status ? 100 : 110000 status ? 110 : 110000 status ? 120 : 110000 status ? 130 : 110000 send stop : 110000 after stop : 11111000 */ /* init i2c : 11111000 no state information available after init : 11111000 start transmission : 11111000 after start : 1000 start condition transmitted send SLA+W : 1000 after SLA+W : 11000 SLA+W transmitted, ACK received send 0xAC (trigger measurement) : 11000 after 0xAC : 101000 send parameter 1st byte 0x33 : 101000 after 0x33 : 101000 send parameter 2nd byte 0x00 : 101000 after 0x00 : 101000 send repeat start : 101000 after repeat start : 10000 send SLA+R : 10000 after SLA+R : 1000000 read 1 data : 1000000 after read : 1011000 ````````````````````````read 2 data : 1011000 after read : 1011000 read 3 data : 1011000 after read : 1011000 ```````````````````````````````````````` : read 4 data : 1011000 after read : 1011000 `read 5 data : 1011000 after read : 1011000 read 6 data : 1011000 after read : 1011000 read 7 data : 1011000 after read : 1011000 ```````````````````````````` : read 8 data : 1011000 after read : 1011000 ` : read 9 data : 1011000 after read : 1011000 ` : send stop : 1011000 after stop : 11111000 */ /* init i2c : 11111000 TW_NO_INFO -> No state information available after init : 11111000 TW_NO_INFO -> No state information available start transmission : 11111000 TW_NO_INFO -> No state information available after start : 1000 TW_START -> Start condition transmitted send SLA+W : 1000 TW_START -> Start condition transmitted after SLA+W : 11000 TW_MT_SLA_ACK -> SLA+W transmitted, ACK received send 0xAC (trigger measurement) : 11000 TW_MT_SLA_ACK -> SLA+W transmitted, ACK received after 0xAC : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received send parameter 1st byte 0x33 : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received after 0x33 : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received send parameter 2nd byte 0x00 : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received after 0x00 : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received send repeat start : 101000 TW_MT_DATA_ACK -> Data transmitted, ACK received after repeat start : 10000 TW_REP_START -> Repeated start condition transmitted send SLA+R : 10000 TW_REP_START -> Repeated start condition transmitted after SLA+R : 1000000 TW_MR_SLA_ACK -> SLA+R transmitted, ACK received read 1 data : 1000000 TW_MR_SLA_ACK -> SLA+R transmitted, ACK received after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 152 read 2 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 196 read 3 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 182 read 4 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 213 read 5 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 255 read 6 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 212 read 7 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 164 read 8 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 255 read 9 data : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after read : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned 255 send stop : 1011000 TW_MR_DATA_NACK -> Data received, NACK returned after stop : 11111000 TW_NO_INFO -> No state information available */ // status codes : // -- Master -- // TW_BUS_ERROR 0x00 = 0b0 = 0 -> illegal start or stop condition // TW_START 0x08 = 0b1000 = 8 -> start condition transmitted // TW_REP_START 0x10 = 0b10000 = 16 -> repeated start condition transmitted // -- Master Transmitter -- // TW_MT_SLA_ACK 0x18 = 0b11000 = 24 -> SLA+W transmitted, ACK received // TW_MT_SLA_NACK 0x20 = 0b100000 = 32 -> SLA+W transmitted, NACK received // TW_MT_DATA_ACK 0x28 = 0b101000 = 40 -> data transmitted, ACK received // TW_MT_DATA_NACK 0x30 = 0b110000 = 48 -> data transmitted, NACK received // TW_MT_ARB_LOST 0x38 = 0b111000 = 56 -> arbitration lost in SLA+W or data // -- Master Receiver -- // TW_MR_ARB_LOST 0x38 = 0b111000 = 56 -> arbitration lost in SLA+R or NACK // TW_MR_SLA_ACK 0x40 = 0b1000000 = 64 -> SLA+R transmitted, ACK received // TW_MR_SLA_NACK 0x48 = 0b1001000 = 72 -> SLA+R transmitted, NACK received // TW_MR_DATA_ACK 0x50 = 0b1010000 = 80 -> data received, ACK returned // TW_MR_DATA_NACK 0x58 = 0b1011000 = 88 -> data received, NACK returned // TW_SR_GCALL_DATA_NACK 0x98 = 0b10011000 = 152 -> general call data received, NACK returned // TW_ST_SLA_ACK 0xA8 = 0b10101000 = 168 -> SLA+R received, ACK returned // TW_NO_INFO 0xF8 = 0b11111000 = 248 -> no state information available #define AHT20_ADDRESS 0x38 // doc AHT20, 7.3 : address of thermistor : 0b111000, 56 // volatile uint8_t i2c_data = 0; void print_hex_value(char c) { char buffer[3] = {0}; int_to_hex_string(c, buffer, 2); uart_printstr(buffer); } void print_status_meaning(uint16_t status) { switch (status) { case 0x00: uart_printstr("TW_BUS_ERROR -> Illegal start or stop condition"); break; case 0x08: uart_printstr("TW_START -> Start condition transmitted"); break; case 0x10: uart_printstr("TW_REP_START -> Repeated start condition transmitted"); break; case 0x18: uart_printstr("TW_MT_SLA_ACK -> SLA+W transmitted, ACK received"); break; case 0x20: uart_printstr("TW_MT_SLA_NACK -> SLA+W transmitted, NACK received"); break; case 0x28: uart_printstr("TW_MT_DATA_ACK -> Data transmitted, ACK received"); break; case 0x30: uart_printstr("TW_MT_DATA_NACK -> Data transmitted, NACK received"); break; case 0x38: uart_printstr("TW_MT_ARB_LOST/TW_MR_ARB_LOST -> Arbitration lost in SLA+W/R or Nack"); break; case 0x40: uart_printstr("TW_MR_SLA_ACK -> SLA+R transmitted, ACK received"); break; case 0x48: uart_printstr("TW_MR_SLA_NACK -> SLA+R transmitted, NACK received"); break; case 0x50: uart_printstr("TW_MR_DATA_ACK -> Data received, ACK returned"); break; case 0x58: uart_printstr("TW_MR_DATA_NACK -> Data received, NACK returned"); break; case 0x98: uart_printstr("TW_SR_GCALL_DATA_NACK -> General call data received, NACK returned"); break; case 0xA8: uart_printstr("TW_ST_SLA_ACK -> SLA+R received, ACK returned"); break; case 0xF8: uart_printstr("TW_NO_INFO -> No state information available"); break; default: uart_printstr("Unknown status code"); } } void _print_status(char *str) { uint8_t status; status = TWSR & 0b11111000; // Table 22-2. Status codes for Master Transmitter Mode uint16_t size = 53; size -= uart_printstr(str); size -= uart_printstr(" : "); size -= uart_printstr_itoa_base(status, 2); // print status meaning while (size--) { uart_tx(' '); } print_status_meaning(status); uart_printstr_endl(""); } void print_status_anyway(char *str) { _print_status(str); } void print_status(char *str) { _print_status(str); return; } void print_data() { uint8_t data; for (uint8_t i = 0; i < 10; i++) { data = i2c_read_nack(); print_hex_value(data); if (i == 0) { uart_tx('('); uart_printstr_itoa_base(data, 2); uart_tx(')'); } if (i < 9) { uart_tx(' '); } } uart_printstr_endl(""); } Boolean aht20_is_status_ready(void) { uint8_t status; i2c_start(); i2c_send_addr_w(AHT20_ADDRESS); // i2c_write(0xAC); // i2c_write(0x33); // i2c_write(0x00); i2c_start_repeat(); i2c_send_addr_r(AHT20_ADDRESS); status = i2c_read_nack(); i2c_stop(); uart_printstr("- status : "); uart_printstr_itoa_base_endl(status, 2); if (status & 0b10000000) { return TRUE; } else { return FALSE; } } void aht20_wait_for_status() { for (uint8_t i = 0; i < 30; i++) { uart_tx('|'); if (aht20_is_status_ready()) { break; } _delay_ms(10); } } // description int main() { uart_init(); // 0x18 : 11000 : 24 // 0x33 : 110011 : 51 -> DATA0 // 0x38 : 111000 : 56 // 0x70 : 1110000 : 112 -> SLA+W // 0x71 : 1110001 : 113 -> SLA+R // 0x80 : 10000000 : 128 // // doc AHT20 7.4 : trigger measurement data and read temperature and humidity // 0. init i2c // 1. after power on, wait >= 100ms // 2. send SLA+W 0x70 // 3. wait 10ms // 4. send 0xAC command (172, 0b10101100) (trigger measurement), this command parameter has 2 bytes : // 5. send DATA0 : 0x33 // 6. send DATA1 : 0x00 // 7. delay >= 80ms (wait for status[7] == 0) // 8. send SLA+R // 9. read 6 bytes // 10. read CRC print_status("init i2c"); i2c_init(); print_status(" after init"); print_status("\r\nstart transmission"); i2c_start(); print_status(" after start"); // aht20_wait_for_status(); print_status("\r\nwaiting 200ms..."); _delay_ms(200); print_status(" done waiting"); print_status("\r\nsend SLA+W"); i2c_send_addr_w(AHT20_ADDRESS); print_status(" after SLA+W"); print_status("\r\nwaiting 20ms..."); _delay_ms(20); print_status(" done waiting"); print_status("\r\nsend 0xAC (trigger measurement)"); i2c_write(0xAC); print_status(" after 0xAC"); print_status("send parameter 1st byte 0x33"); i2c_write(0x33); print_status(" after 0x33"); print_status("send parameter 2nd byte 0x00"); i2c_write(0x00); print_status(" after 0x00"); for (uint8_t i = 0; i < 10; i++) { // print_status("\r\nwaiting 100ms..."); // _delay_ms(100); // print_status(" done waiting"); // aht20_wait_for_status(); print_status("\r\nsend repeat start"); i2c_start_repeat(); print_status(" after repeat start"); print_status("\r\nsend SLA+R"); i2c_send_addr_r(AHT20_ADDRESS); print_status_anyway(" after SLA+R"); print_status("\r\nbefore read data"); print_data(); print_status(" after read data"); _delay_ms(300); } print_status("\r\nsend stop"); i2c_stop(); print_status(" after stop"); while(1); }