the nwewr I2C implmentation on the stm32f042 is wierd triying to figure it out

i2c
kerem 3 years ago
parent e1c061bd1f
commit 2602e66c4d

@ -33,6 +33,9 @@ extern "C" {
#include "hardwareDescription.h" #include "hardwareDescription.h"
#include "pin.h" #include "pin.h"
uint32_t i2cCR1;
uint32_t i2cCR2;
uint32_t i2cISR;
/*! Enum of possible I2C opperation modes */ /*! Enum of possible I2C opperation modes */
typedef enum{ typedef enum{

@ -35,17 +35,16 @@ void i2cInit(i2c_t *i2cHardware)
//Configure analog filter. Anlalog filter is on //Configure analog filter. Anlalog filter is on
I2C_BASE->CR1 &=~ I2C_CR1_ANFOFF; I2C_BASE->CR1 &=~ I2C_CR1_ANFOFF;
//Configure the clock
I2C_BASE->TIMINGR = i2cHardware->timing;
//Configure NoStrech Streching mode is disabled (slave only) //Configure NoStrech Streching mode is disabled (slave only)
I2C_BASE->CR1 |= I2C_CR1_NOSTRETCH; I2C_BASE->CR1 |= I2C_CR1_NOSTRETCH;
//Configure the clock
I2C_BASE->TIMINGR = i2cHardware->timing;
//Automatic end mode (master mode) Enablede as default //Automatic end mode (master mode) Enablede as default
I2C_BASE->CR2 |= I2C_CR2_AUTOEND; I2C_BASE->CR2 |= I2C_CR2_AUTOEND;
if(i2cHardware->mode == i2cModeMaster) if(i2cHardware->mode == i2cModeMaster)
{ {
if(i2cHardware->addressSize == i2cAddressSizeTenBits) if(i2cHardware->addressSize == i2cAddressSizeTenBits)
@ -61,6 +60,10 @@ void i2cInit(i2c_t *i2cHardware)
//activating the Perriferal. //activating the Perriferal.
I2C_BASE->CR1 |= I2C_CR1_PE; I2C_BASE->CR1 |= I2C_CR1_PE;
i2cCR1= I2C_BASE->CR1;
i2cCR2= I2C_BASE->CR2;
i2cISR= I2C_BASE->ISR;
i2cHardware->state = i2cInitialized; 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. //Wait until the start condition in generated.
while(!(I2C_BASE->ISR & (I2C_ISR_BUSY))); 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;
} }

@ -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[]) int main(int argc, char *argv[])
{ {
uint8_t i = 0; uint8_t i = 0;
uint8_t slaveAddress = 0xC0; uint8_t slaveAddress = 0xC0;
uint8_t registerToRead = 0x00; uint8_t registerToRead = 0x00;
uint8_t charTosend = 0; uint8_t i2cRecieved = 0;
char buffer [8]; char buffer [8];
// making array with all available timers // 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}; //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.wakeOn = i2cWakeUpDisabled;
i2c_1.state = i2cNotInitialized; i2c_1.state = i2cNotInitialized;
print_Usart(usart2, "I2C init started\n\r");
i2cInit(&i2c_1); i2cInit(&i2c_1);
print_Usart(usart2, "I2C initialized\n\r"); print_Usart(usart2, "I2C initialized\n\r");
print_Usart(usart2, "I2C_BASE->ISR & I2C_ISR_TXIS : ");
i2cMasterRecieve(&i2c_1,slaveAddress,&registerToRead,&charTosend); print_Usart(usart2, "\n\r");
print_Usart(usart2, "CR1 : ");
printBinary32(i2cCR1,0);
print_Usart(usart2, "\n\r");
buffer[0] = charTosend>>4; //4 MSB print_Usart(usart2, "\n\r");
buffer[1] = charTosend& ((1 << 3)); //4 LSB 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,&registerToRead,&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, 0x30);
usartSendChar(usart2, 'x'); usartSendChar(usart2, 'x');
usartSendChar(usart2, buffer[0]+0x30); usartSendChar(usart2, buffer[0]+0x30);
usartSendChar(usart2, buffer[1]+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"); print_Usart(usart2, "All is working fine\n\r");

Loading…
Cancel
Save