STM32L4 Problem z zapisem, odczytem z zewnętrznej pamięci I2C

Wszystko o naszych nuklejkach od STM
ODPOWIEDZ
pawel
Nowy
Posty: 1
Rejestracja: 28 sty 2018, 7:29

STM32L4 Problem z zapisem, odczytem z zewnętrznej pamięci I2C

Post autor: pawel » 29 sty 2018, 20:19

Trochę się już z tym męczę, nie wiem dlaczego wartość zapisywana do pamięci I2C różni się od wartości odczytywanej. Może ktoś miał podobny problem i wie jak można go rozwiązać. (Pamięć nie jest chroniona przed zapisem).
Poniżej wycinek procesu zapisu do pamięci.
Obrazek

Poniżej proces odczytu z pamięci SPI.
Obrazek

Poniżej przykładowy kod, który używam do zapisywania oraz odczytywania z pamięci I2C.

Kod: Zaznacz cały

#define I2C_DEVICE_ADDRESS (0x50 << 1)
#define MEM_WRITE_ADDRESS 0x1
#define MEM_READ_ADDRESS 0x1
uint8_t DataWrite = 7;
uint8_t DataRead = 0;
HAL_I2C_Mem_Write(&hi2c1, I2C_DEVICE_ADDRESS, MEM_WRITE_ADDRESS, 1, &DataWrite, 1, 250)
HAL_Delay(1000);
HAL_I2C_Mem_Read(&hi2c1, I2C_DEVICE_ADDRESS, MEM_READ_ADDRESS, 1, &DataRead, 1, 250)

Awatar użytkownika
squeez
Użytkownik
Posty: 79
Rejestracja: 16 paź 2017, 23:52

Re: STM32L4 Problem z zapisem, odczytem z zewnętrznej pamięci I2C

Post autor: squeez » 29 sty 2018, 20:59

komunikację robisz na przerwaniach czy w pętli głównej? bo jak na przerwaniach to np. w F103 trzeba erratę przeczytać bo jest tam błąd w krzemie i należy zmienić priorytety przerwań. Może w L jest podobnie.

tutaj kod który kiedyś poczyniłem co prawda na rejestrach nie HAL ale działał, używałem go do RTC i OLED dla F103.

Kod: Zaznacz cały

void I2C_Init(void)
{
   // I2C GPIO CONFIG
   GPIOB->CRL |= GPIO_CRL_CNF6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE6 | GPIO_CRL_MODE7;

   // Software reset I2C
   I2C1->CR1 |= I2C_CR1_SWRST;
   I2C1->CR1 &= ~I2C_CR1_SWRST;

   I2C1->CR1 &= ~I2C_CR1_PE;
   I2C1->CR2 = I2C_CR2_FREQ_3;
   I2C1->TRISE = 9;
   I2C1->CCR = 0x24;

   // Wlaczenie I2C
   I2C1->CR1 |= I2C_CR1_PE | I2C_CR1_ACK;
   I2C1->OAR1 = (1 << 14);
}


void I2C_Start(void)
{
   I2C1->CR1 |= I2C_CR1_START;
   while( !(I2C1->SR1 & I2C_SR1_SB) );
   uint32_t tmp = I2C1->SR1;
}

void I2C_Stop(void)
{
   while( !(I2C1->SR1 & I2C_SR1_BTF) );
   I2C1->CR1 |= I2C_CR1_STOP;
}

void I2C_SendAddr(uint8_t address)
{
   I2C1->DR = address;
   while( !(I2C1->SR1 & I2C_SR1_ADDR) );
   uint32_t dummy = I2C1->SR1;
   dummy = I2C1->SR2;
}

void I2C_SendByte(uint8_t byte)
{
   while( !(I2C1->SR1 & I2C_SR1_TXE) );
   I2C1->DR = byte;
}

ODPOWIEDZ