From 63c541e4e5d850312386aa0c971e29b9a4f891f5 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sat, 3 Aug 2019 12:05:11 +0100 Subject: [PATCH 1/2] working i2c read/write --- .../Firmware/Src/VoltageSensorActualValue.c | 129 +++++++++++++++++- 1 file changed, 126 insertions(+), 3 deletions(-) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index eec9e53..5faed86 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -18,9 +18,12 @@ static void GPIO_setup(void); static void I2C_setup(void); -static uint8_t getRegisterValue(uint8_t registerId); +//static uint8_t getRegisterValue(uint8_t registerId); +static void write(uint8_t registerId); +static void read(uint8_t registerId); + void VoltageSensorActualValue_Init() { GPIO_setup(); @@ -30,7 +33,10 @@ void VoltageSensorActualValue_Init() bool VoltageSensorActualValue_GetMeasurementData(VoltageSensorActualValue_MeasurementData_t *measurementData) { - *measurementData = getRegisterValue(0x0); + write(0x00); + write(0x10); + + read(0); if (*measurementData == 0) { @@ -62,11 +68,128 @@ void I2C_setup(void) I2C_Cmd(ENABLE); } +static void write(uint8_t registerId) +{ + I2C_GenerateSTART(ENABLE); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + + I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + + I2C_SendData(registerId); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + + +// I2C_GenerateSTOP(ENABLE); +// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); + +/* + I2C_GenerateSTART(ENABLE); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + + I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); + + I2C_AcknowledgeConfig(DISABLE); + I2C_GenerateSTOP(ENABLE); + + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + registerValue = I2C_ReceiveData(); + + + I2C_AcknowledgeConfig(ENABLE); +*/ + I2C_GenerateSTOP(ENABLE); + while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); +} + +static void read(uint8_t registerId) +{ + + I2C_GenerateSTART(ENABLE); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + + I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); + + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + int registerValue = I2C_ReceiveData(); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + + I2C_AcknowledgeConfig(DISABLE); + I2C_GenerateSTOP(ENABLE); + + + I2C_AcknowledgeConfig(ENABLE); + +} uint8_t getRegisterValue(uint8_t registerId) { uint8_t registerValue = 0xFF; +/* +registerId=0x10; +static int i=0; +i++; +registerId=i; +*/ +static int i=0; +i++; + + + I2C_GenerateSTART(ENABLE); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + + I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + + I2C_SendData(registerId); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + + + +// I2C_GenerateSTOP(ENABLE); +// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); + + + I2C_GenerateSTART(ENABLE); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); +if (i>2) +{ + I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); + + I2C_AcknowledgeConfig(DISABLE); + I2C_GenerateSTOP(ENABLE); + + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + registerValue = I2C_ReceiveData(); + + + I2C_AcknowledgeConfig(ENABLE); +// I2C_GenerateSTOP(ENABLE); +// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); + +} +else +{ + I2C_GenerateSTOP(ENABLE); + +} + + + + +#if 0 I2C_GenerateSTART(ENABLE); while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); @@ -101,7 +224,7 @@ uint8_t getRegisterValue(uint8_t registerId) I2C_AcknowledgeConfig(ENABLE); // I2C_GenerateSTOP(ENABLE); // while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); - +#endif return registerValue; } From 84fe25ffd69c64eff1231ad0c5d335b854bc8194 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sat, 3 Aug 2019 13:12:32 +0100 Subject: [PATCH 2/2] i2c read is ok on ociloscope not on firmware --- software/Firmware/Src/Logger.c | 4 +- .../Firmware/Src/VoltageSensorActualValue.c | 168 +++--------------- 2 files changed, 26 insertions(+), 146 deletions(-) diff --git a/software/Firmware/Src/Logger.c b/software/Firmware/Src/Logger.c index a659791..72ae0a5 100644 --- a/software/Firmware/Src/Logger.c +++ b/software/Firmware/Src/Logger.c @@ -7,7 +7,7 @@ #include "Logger.h" -//#define USE_PRINTF +#define USE_PRINTF #if defined USE_PRINTF #include #endif @@ -21,7 +21,7 @@ static void GPIO_setup(void); static void UART1_setup(void); -#if defined USE_PRINT +#if defined USE_PRINTF int putchar(int c) #else void putchar(char c) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index 5faed86..508e9c9 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -9,40 +9,35 @@ #include "PinoutConfiguration.h" #include "UserInterface.h" #include "stm8s_i2c.h" - +#include #define I2C_OWN_ADDRESS 0x10 // MCP3425 I2C address is 0x68(104), this 7 bits, they need to be // shifted by one, to make 8 bits variable, where less signifant bit // is used to signalize communication direction (rx or tx) -#define I2C_SLAVE_ADDRESS (0x68 << 1) +#define I2C_SLAVE_ADDRESS (0x68u << 1) static void GPIO_setup(void); static void I2C_setup(void); -//static uint8_t getRegisterValue(uint8_t registerId); - - static void write(uint8_t registerId); -static void read(uint8_t registerId); +static uint16_t read(uint8_t registerId); + void VoltageSensorActualValue_Init() { GPIO_setup(); I2C_setup(); + + // seleect adc configuration and start measurement + write(0x00); } bool VoltageSensorActualValue_GetMeasurementData(VoltageSensorActualValue_MeasurementData_t *measurementData) { - write(0x00); write(0x10); + *measurementData = read(0); +// read(0); - read(0); - - if (*measurementData == 0) - { - // for temporary debug only - UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); - } // getRegisterValue should return false on timeout and this should be later propagated to GUI component. return TRUE; @@ -68,6 +63,7 @@ void I2C_setup(void) I2C_Cmd(ENABLE); } + static void write(uint8_t registerId) { I2C_GenerateSTART(ENABLE); @@ -79,152 +75,36 @@ static void write(uint8_t registerId) I2C_SendData(registerId); while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - - -// I2C_GenerateSTOP(ENABLE); -// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); - -/* - I2C_GenerateSTART(ENABLE); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); - - I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); - - UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); - - I2C_AcknowledgeConfig(DISABLE); - I2C_GenerateSTOP(ENABLE); - - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); - registerValue = I2C_ReceiveData(); - - - I2C_AcknowledgeConfig(ENABLE); -*/ I2C_GenerateSTOP(ENABLE); while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); } -static void read(uint8_t registerId) -{ +static uint16_t read(uint8_t registerId) +{ I2C_GenerateSTART(ENABLE); while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); - - UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); - - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); - int registerValue = I2C_ReceiveData(); - while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + + for(int i=0; i<4; i++) + { + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + uint16_t registerMSB = I2C_ReceiveData(); + + printf("%d\n", registerMSB); + + } +// while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); +// uint16_t registerLSB = I2C_ReceiveData(); I2C_AcknowledgeConfig(DISABLE); I2C_GenerateSTOP(ENABLE); - - - I2C_AcknowledgeConfig(ENABLE); - -} - -uint8_t getRegisterValue(uint8_t registerId) -{ - uint8_t registerValue = 0xFF; -/* -registerId=0x10; -static int i=0; -i++; -registerId=i; -*/ - -static int i=0; -i++; - - - I2C_GenerateSTART(ENABLE); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); - - I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); - - I2C_SendData(registerId); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - - - - -// I2C_GenerateSTOP(ENABLE); // while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); + uint16_t registerValue = 0; - I2C_GenerateSTART(ENABLE); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); -if (i>2) -{ - I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); - - UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); - - I2C_AcknowledgeConfig(DISABLE); - I2C_GenerateSTOP(ENABLE); - - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); - registerValue = I2C_ReceiveData(); - - - I2C_AcknowledgeConfig(ENABLE); -// I2C_GenerateSTOP(ENABLE); -// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); - -} -else -{ - I2C_GenerateSTOP(ENABLE); - -} - - - - -#if 0 - I2C_GenerateSTART(ENABLE); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); - - I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_TX); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); - - I2C_SendData(registerId); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - - - - -// I2C_GenerateSTOP(ENABLE); -// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); - - - I2C_GenerateSTART(ENABLE); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); - - I2C_Send7bitAddress(I2C_SLAVE_ADDRESS, I2C_DIRECTION_RX); - while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); - - UserInterface_ShowMessage(USER_INTERFACE_COLLECTING_DATA_MSG); - - I2C_AcknowledgeConfig(DISABLE); - I2C_GenerateSTOP(ENABLE); - - while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); - registerValue = I2C_ReceiveData(); - - - I2C_AcknowledgeConfig(ENABLE); -// I2C_GenerateSTOP(ENABLE); -// while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); -#endif return registerValue; }