From 2602e66c4df2e22c81f4de3a30cd32516b4e6939 Mon Sep 17 00:00:00 2001 From: kerem Date: Wed, 27 Jul 2022 22:04:10 +0200 Subject: [PATCH] the nwewr I2C implmentation on the stm32f042 is wierd triying to figure it out --- ked/csl/interfaces/i2c.h | 3 ++ ked/csl/stm32f042/Src/i2c.c | 23 ++++++++-- main.c | 85 +++++++++++++++++++++++++++++++++---- 3 files changed, 99 insertions(+), 12 deletions(-) diff --git a/ked/csl/interfaces/i2c.h b/ked/csl/interfaces/i2c.h index e6d0805..59bc4ef 100755 --- a/ked/csl/interfaces/i2c.h +++ b/ked/csl/interfaces/i2c.h @@ -33,6 +33,9 @@ extern "C" { #include "hardwareDescription.h" #include "pin.h" +uint32_t i2cCR1; +uint32_t i2cCR2; +uint32_t i2cISR; /*! Enum of possible I2C opperation modes */ typedef enum{ diff --git a/ked/csl/stm32f042/Src/i2c.c b/ked/csl/stm32f042/Src/i2c.c index ad7582f..34fc6e6 100644 --- a/ked/csl/stm32f042/Src/i2c.c +++ b/ked/csl/stm32f042/Src/i2c.c @@ -35,17 +35,16 @@ void i2cInit(i2c_t *i2cHardware) //Configure analog filter. Anlalog filter is on I2C_BASE->CR1 &=~ I2C_CR1_ANFOFF; - - //Configure the clock - I2C_BASE->TIMINGR = i2cHardware->timing; //Configure NoStrech Streching mode is disabled (slave only) I2C_BASE->CR1 |= I2C_CR1_NOSTRETCH; + //Configure the clock + I2C_BASE->TIMINGR = i2cHardware->timing; + //Automatic end mode (master mode) Enablede as default I2C_BASE->CR2 |= I2C_CR2_AUTOEND; - if(i2cHardware->mode == i2cModeMaster) { if(i2cHardware->addressSize == i2cAddressSizeTenBits) @@ -61,6 +60,10 @@ void i2cInit(i2c_t *i2cHardware) //activating the Perriferal. I2C_BASE->CR1 |= I2C_CR1_PE; + i2cCR1= I2C_BASE->CR1; + i2cCR2= I2C_BASE->CR2; + i2cISR= I2C_BASE->ISR; + i2cHardware->state = i2cInitialized; } @@ -113,5 +116,17 @@ void i2cMasterRecieve(i2c_t *i2cHardware, uint8_t devAddress, uint8_t *registerA //Wait until the start condition in generated. while(!(I2C_BASE->ISR & (I2C_ISR_BUSY))); + + //Check if the TX buffer is empty + while(!(I2C_BASE->ISR & (I2C_ISR_TXE))); + + //write the register that we wahtn to read + I2C_BASE->TXDR = registerAddress; + + i2cCR1= I2C_BASE->CR1; + i2cCR2= I2C_BASE->CR2; + i2cISR= I2C_BASE->ISR; + //while(!(I2C_BASE->ISR & (I2C_ISR_RXNE))); + //data = I2C_BASE->RXDR; } diff --git a/main.c b/main.c index 7997a22..32eab53 100644 --- a/main.c +++ b/main.c @@ -39,13 +39,47 @@ void timer_capture_compare_test(timerNo_t timer) } +void printBinary32(uint32_t toPrint, uint8_t lsbFirst) +{ + int i; + char pt; + print_Usart(usart2, "\n\r"); + if(lsbFirst) + { + print_Usart(usart2, "| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|"); + print_Usart(usart2, "\n\r"); + usartSendChar(usart2, '|'); + for(i=0; i < 32; i++) + { + pt = (toPrint >> i) & 1; + usartSendChar(usart2, ' '); + usartSendChar(usart2, pt + 0x30); + usartSendChar(usart2, '|'); + } + } + else + { + print_Usart(usart2, "|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|"); + print_Usart(usart2, "\n\r"); + usartSendChar(usart2, '|'); + for(i=0; i < 32; i++) + { + pt = (toPrint >> 31-i) & 1; + usartSendChar(usart2, ' '); + usartSendChar(usart2, pt + 0x30); + usartSendChar(usart2, '|'); + } + } +} + + int main(int argc, char *argv[]) { uint8_t i = 0; uint8_t slaveAddress = 0xC0; uint8_t registerToRead = 0x00; - uint8_t charTosend = 0; + uint8_t i2cRecieved = 0; char buffer [8]; // making array with all available timers //timerNo_t timers[MAX_TIMER_CHANNEL_COUNT] = {timer_1, timer_2, timer_3, timer_14, timer_16, timer_17}; @@ -101,22 +135,57 @@ int main(int argc, char *argv[]) i2c_1.wakeOn = i2cWakeUpDisabled; i2c_1.state = i2cNotInitialized; - print_Usart(usart2, "I2C init started\n\r"); i2cInit(&i2c_1); print_Usart(usart2, "I2C initialized\n\r"); - print_Usart(usart2, "I2C_BASE->ISR & I2C_ISR_TXIS : "); - i2cMasterRecieve(&i2c_1,slaveAddress,®isterToRead,&charTosend); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "CR1 : "); + printBinary32(i2cCR1,0); + print_Usart(usart2, "\n\r"); - buffer[0] = charTosend>>4; //4 MSB - buffer[1] = charTosend& ((1 << 3)); //4 LSB + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "CR2 : "); + printBinary32(i2cCR2,0); + print_Usart(usart2, "\n\r"); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "ISR : "); + printBinary32(i2cISR,0); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "I2C Send Mode\n\r"); + + i2cMasterRecieve(&i2c_1,slaveAddress,®isterToRead,&i2cRecieved); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "CR1 : "); + printBinary32(i2cCR1,0); + print_Usart(usart2, "\n\r"); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "CR2 : "); + printBinary32(i2cCR2,0); + print_Usart(usart2, "\n\r"); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "ISR : "); + printBinary32(i2cISR,0); + + print_Usart(usart2, "\n\r"); + print_Usart(usart2, "\n\r"); + + + print_Usart(usart2, "I2C Recieved : "); + buffer[0] = i2cRecieved>>4; //4 MSB + buffer[1] = i2cRecieved& ((1 << 3)); //4 LSB usartSendChar(usart2, 0x30); usartSendChar(usart2, 'x'); usartSendChar(usart2, buffer[0]+0x30); usartSendChar(usart2, buffer[1]+0x30); - print_Usart(usart2, "\n\r"); - + print_Usart(usart2, "\n\r"); print_Usart(usart2, "All is working fine\n\r");