printing complete status infos

This commit is contained in:
hugo LAMY
2025-03-16 17:36:48 +01:00
parent 35582f4286
commit e4bbf40bb8
4 changed files with 173 additions and 49 deletions

View File

@@ -278,6 +278,52 @@ 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
*/
// status codes :
// -- Master --
// TW_BUS_ERROR 0x00 = 0b0 = 0 -> illegal start or stop condition
@@ -303,12 +349,41 @@ send stop : 110000
void print_hex_value(char c) {}
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
uart_printstr(str);
uart_printstr(" : ");
uart_printstr_itoa_base_endl(status, 2);
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("");
}
// description
@@ -376,33 +451,71 @@ int main() {
i2c_send_addr_r(SLAVE_ADDRESS);
print_status(" after SLA+R");
print_status("\r\nstatus ? 0");
_delay_ms(10);
print_status("status ? 10");
_delay_ms(10);
print_status("status ? 20");
_delay_ms(10);
print_status("status ? 30");
_delay_ms(10);
print_status("status ? 40");
_delay_ms(10);
print_status("status ? 50");
_delay_ms(10);
print_status("status ? 60");
_delay_ms(10);
print_status("status ? 70");
_delay_ms(10);
print_status("status ? 80");
_delay_ms(10);
print_status("status ? 90");
_delay_ms(10);
print_status("status ? 100");
_delay_ms(10);
print_status("status ? 110");
_delay_ms(10);
print_status("status ? 120");
_delay_ms(10);
print_status("status ? 130");
// print_status("\r\nstatus ? 0");
// _delay_ms(10);
// print_status("status ? 10");
// _delay_ms(10);
// print_status("status ? 20");
// _delay_ms(10);
// print_status("status ? 30");
// _delay_ms(10);
// print_status("status ? 40");
// _delay_ms(10);
// print_status("status ? 50");
// _delay_ms(10);
// print_status("status ? 60");
// _delay_ms(10);
// print_status("status ? 70");
// _delay_ms(10);
// print_status("status ? 80");
// _delay_ms(10);
// print_status("status ? 90");
// _delay_ms(10);
// print_status("status ? 100");
// _delay_ms(10);
// print_status("status ? 110");
// _delay_ms(10);
// print_status("status ? 120");
// _delay_ms(10);
// print_status("status ? 130");
uint8_t data;
print_status("\r\nread 1 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 2 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 3 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 4 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 5 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 6 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 7 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 8 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("read 9 data");
data = i2c_read();
print_status(" after read");
uart_printstr_itoa_base_endl(data, 10);
print_status("\r\nsend stop");
i2c_stop();