Пытаюсь написать алгоритм работы с SPI EEPROM, но из-за недостатка опыта сомневаюсь в правильности алгоритмов, потому требуется помощь.
Контроллер STM32F103C8 (Reference manual)
Память M95M01 (pdf)
В общем, начал с низкоуровневых функций. Настройка SPI2, поднятие преываний на прием и окончание передачи.
Как я понимаю передача и приём идет одновременно. В интернете полно примеров, но там используются всякие костыли типа
Код: Выделить всё
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); В общем, функция для отправки байта
Код: Выделить всё
typedef enum
{
SPI_EEPROM_STATUS_BSY, // Spi is busy
SPI_EEPROM_STATUS_RDY
} SpiEepromStatus;
typedef struct
{
unsigned spiByteReseived: 1;
unsigned spiByteTransmited: 1;
} SpiState_TypeDef;
SpiEepromStatus ui8EepromSendByte(uint8_t byte)
{
SpiEepromStatus Status = SPI_EEPROM_STATUS_BSY;
if (SPI2->SR & SPI_SR_TXE)
{
SPI2->DR = byte;
Status = SPI_EEPROM_STATUS_RDY;
}
else
Status = SPI_EEPROM_STATUS_BSY;
return Status;
}
Код: Выделить всё
ui8EepromSendByte Функция прерывания
Код: Выделить всё
void SPI2_IRQHandler (void)
{
if (SPI2->SR & SPI_SR_RXNE)
{
ui8ByteFromSpiEeprom = SPI2->DR;
vSetSpiEepromFlag (&SpiState, SPI_BYTE_RECEIVED);
}
if (SPI2->SR & SPI_SR_TXE)
{
SPI2->SR &= ~SPI_SR_TXE;
}
}Реализованное битовое поле
Код: Выделить всё
typedef struct
{
unsigned spiByteReseived: 1;
unsigned spiByteTransmited: 1;
} SpiState_TypeDef;