From 8c91470e8588b9eb0353798f6ae6c3f070129bba Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Sat, 23 Jun 2018 15:00:13 +0900 Subject: [PATCH] helix serial.c debugging... --- keyboards/helix/serial.c | 175 +++++++++++++++++++++++++++++---------- 1 file changed, 133 insertions(+), 42 deletions(-) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 7b4b8ceeb8..b6fb263d41 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -14,9 +14,16 @@ #ifdef USE_SERIAL +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + // Serial pulse period in microseconds. Its probably a bad idea to lower this // value. -#define SERIAL_DELAY 30 +#define SERIAL_DELAY 6 // micro sec +#define READ_WRITE_START_ADJUST 20 // cycles +#define READ_WRITE_WIDTH_ADJUST 10 // cycles + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; @@ -30,13 +37,13 @@ void serial_delay(void) { } inline static -void serial_delay_half(void) { - _delay_us(SERIAL_DELAY/2); +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); } inline static -void serial_delay_quart(void) { - _delay_us(SERIAL_DELAY/4); +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); } inline static @@ -116,9 +123,10 @@ void sync_recv(void) { while (!serial_read_pin()); #if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; - _delay_us(3); - SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + //_delay_us(3); + //SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; #endif +#if 0 //serial_delay(); #if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_SYNC _delay_us(SERIAL_DELAY-8); @@ -126,6 +134,7 @@ void sync_recv(void) { #else _delay_us(SERIAL_DELAY-5); #endif +#endif } // Used by the slave to send a synchronization signal to the master. @@ -149,85 +158,120 @@ void sync_send(void) { static uint8_t serial_read_byte(void) { uint8_t byte = 0; - serial_input(); + _delay_sub_us(READ_WRITE_START_ADJUST); for ( uint8_t i = 0; i < 8; ++i) { + serial_delay_half1(); // read the middle of pulses byte = (byte << 1) | serial_read_pin(); #if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE - SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; - _delay_us(1); - SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; - serial_delay(); + SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK; + //_delay_us(1); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK; + serial_delay_half2(); #else - serial_delay(); - _delay_us(1); + serial_delay_half2(); + //_delay_us(1); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); #endif } - return byte; } // Sends a byte with MSB ordering static void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { + uint8_t b = 1<<7; + //serial_output(); + while( b ) { + if(data & b) { serial_high(); } else { serial_low(); } + b >>= 1; #if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE - SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK; #endif serial_delay(); #if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE - SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; + SERIAL_DBGPIN_PORT ^= SERIAL_DBGPIN_MASK; #endif } + serial_low(); } // interrupt handle to be used by the slave device ISR(SERIAL_PIN_INTERRUPT) { sync_send(); - + // slave send phase uint8_t checksum = 0; for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; +#endif serial_write_byte(serial_slave_buffer[i]); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif sync_send(); checksum += serial_slave_buffer[i]; } serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); + serial_low(); - // read the middle of pulses -#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE) - SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + // slave switch to input +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //1 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); #endif - _delay_us(SERIAL_DELAY/2); -#if SERIAL_DEBUG_MODE & (SERIAL_DEBUG_MODE_WATCH_SYNC|SERIAL_DEBUG_MODE_WATCH_RCVSAMPLE) - SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; + sync_send(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + serial_delay_half1(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //2 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); +#endif + serial_low(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + serial_input(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //3 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); +#endif + serial_delay(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; #endif + // slave recv phase + sync_recv(); uint8_t checksum_computed = 0; for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; +#endif serial_master_buffer[i] = serial_read_byte(); - sync_send(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + sync_recv(); checksum_computed += serial_master_buffer[i]; } uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction if ( checksum_computed != checksum_received ) { status |= SLAVE_DATA_CORRUPT; } else { status &= ~SLAVE_DATA_CORRUPT; } + sync_recv(); //weit master output to hight } inline @@ -258,41 +302,88 @@ int serial_update_buffers(void) { // check if the slave is present if (serial_read_pin()) { // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); sei(); return 1; } + // master recv phase // if the slave is present syncronize with it sync_recv(); uint8_t checksum_computed = 0; // receive data from the slave for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; +#endif serial_slave_buffer[i] = serial_read_byte(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif sync_recv(); checksum_computed += serial_slave_buffer[i]; } uint8_t checksum_received = serial_read_byte(); - sync_recv(); if (checksum_computed != checksum_received) { + serial_output(); + serial_high(); sei(); return 2; } + // master switch to output +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //1 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); +#endif + sync_recv(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + serial_delay(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //2 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); +#endif + serial_output(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + serial_low(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + //3 + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; + _delay_us(1); +#endif + serial_delay_half1(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_IOCHG + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + + // master send phase uint8_t checksum = 0; - // send data to the slave + + sync_send(); for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT |= SERIAL_DBGPIN_MASK; +#endif serial_write_byte(serial_master_buffer[i]); - sync_recv(); +#if SERIAL_DEBUG_MODE & SERIAL_DEBUG_MODE_WATCH_BYTEWIDTH + SERIAL_DBGPIN_PORT &= ~SERIAL_DBGPIN_MASK; +#endif + sync_send(); checksum += serial_master_buffer[i]; } serial_write_byte(checksum); - sync_recv(); // always, release the line when not in use - serial_output(); - serial_high(); + sync_send(); sei(); return 0;