From 4a76fac591d649d1a32c7983885c6126a8881f5f Mon Sep 17 00:00:00 2001 From: Derisis13 Date: Mon, 12 Dec 2022 17:20:24 +0100 Subject: [PATCH] feature: implemented i2c dumping todo: spi, d28, d32 read & write, i2c write todo: invalid state handling --- Core/Inc/main.h | 10 ++++++++++ Core/Src/main.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 054e629..fdf2aeb 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -60,6 +60,16 @@ void Error_Handler(void); /* USER CODE BEGIN EFP */ +void i2c_dump(uint16_t dev_address, uint16_t capacity); +void spi_dump(uint16_t capacity); +void d28_dump(uint16_t capacity); +void d32_dump(uint16_t capacity); + +void i2c_write(uint16_t dev_address, uint16_t capacity); +void spi_write(uint16_t capacity); +void d28_write(uint16_t capacity); +void d32_write(uint16_t capacity); + /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ diff --git a/Core/Src/main.c b/Core/Src/main.c index e858b9d..4371368 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -65,6 +65,33 @@ extern uint8_t CDC_Transmit_FS(uint8_t *Buf, uint16_t Len); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ +/* ----------------------------------------------------------------------------- + * convert a hex to ascii string + * input is a byte array (binary), output is a character array (str) + * len is the number of bytes to convert, str needs to be at least 2x as big + * -------------------------------------------------------------------------- */ +void hex_to_ascii (const uint8_t *binary, char *str, uint16_t len) { + for (uint16_t i = 0; i < len; ++i) { + uint8_t low = binary [i] & 0x0f; + uint8_t high = binary [i] >> 4; + str [2 * i] = (low > 0x9) ? low + '0' : low - 0xA + 'A'; + str [2 * i + 1] = (high > 0x9) ? high + '0' : high - 0xA + 'A'; + } +} + +void i2c_dump(uint16_t dev_address, uint16_t capacity) { + const uint16_t bsize = 512; + char tx_buff [bsize * 2]; + uint8_t read_buff [bsize]; + for (uint16_t i = 0; i < capacity; i += bsize) { + HAL_I2C_Mem_Read(&hi2c1, dev_address, i, capacity, read_buff, bsize, 1000); + hex_to_ascii(read_buff, tx_buff, bsize); + CDC_Transmit_FS((uint8_t *) tx_buff, bsize * 2); + } +} + +// todo spi, d28, d32 read & write, i2c write + /* USER CODE END 0 */ /** @@ -110,6 +137,7 @@ int main(void) switch (st) { case read_i2c: + i2c_dump(i2c_address, limit_address); st = run; break; case read_spi: