#arm #stm32 #spi
#рука #stm32 #spi
Вопрос:
Мне нужно связаться с микросхемой eeprom (25lc1024) через SPI. Я могу заставить следующий код работать, но мне приходится прибегать к задержкам не только из-за флагов. В противном случае я вижу в области видимости, что он не ждет, пока все биты будут сдвинуты, и продолжает работу. Есть какие-нибудь идеи, почему флаги не останавливают это?
void Init_SPI(void){
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // enable SPI clock
GPIOA->AFR[0] |= SET_AFL_A_FOR_SPI1;
GPIOB->AFR[0] |= SET_AFL_B_FOR_SPI1;
SPI1_NSS = DESELECT_CHIP; // set the SS pin high
// initialize the SPI configuration register
SPI1->CR1 = SPI_CR1_MSTR // SPI master mode
| SPI_CR1_BR_1; // 010 bit rate prescale /8 (60MHz/8 = 7.5MHz)
SPI1->CR2 = SPI_CR2_SSOE;
SPI1->CR1 |= SPI_CR1_SPE; // enable SPI
}
unsigned int eeprom_read(unsigned long address, unsigned int chars_to_read)
{
char temp;
unsigned int result = 0;
SPI1_NSS = SELECT_CHIP; // set the SS pin low
SPI1->DR = READ_FROM_SPI; // send data out SPI
while( !(SPI1->SR amp; SPI_SR_TXE) ); // wait until transmit buffer empty
SPI1->DR = (address amp; 0xFF0000) >> ADJ16; // send data out SPI
while( !(SPI1->SR amp; SPI_SR_TXE) ); // wait until transmit buffer empty
SPI1->DR = (address amp; 0x00FF00) >> ADJ8; // send data out SPI
while( !(SPI1->SR amp; SPI_SR_TXE) ); // wait until transmit buffer empty
SPI1->DR = (address amp; 0x0000FF); // send data out SPI
while( !(SPI1->SR amp; SPI_SR_TXE) ); // wait until transmit buffer empty
delay();
temp = SPI1->DR;
SPI1->DR = DUMMY_8BIT; // send dummy 8 bits to generate clock
chars_to_read--;
while( !(SPI1->SR amp; SPI_SR_RXNE) ); // wait until receive buffer is not empty
//USART2->DR = SPI1->DR;
result = SPI1->DR;
if(chars_to_read != 0){
while((SPI1->SR amp; SPI_SR_RXNE) ); // wait until receive buffer is empty
delay();
SPI1->DR = DUMMY_8BIT; // send dummy 8 bits to generate clock
//delay();
while( !(SPI1->SR amp; SPI_SR_TXE) ); // wait until transmit buffer is empty
while( !(SPI1->SR amp; SPI_SR_RXNE) ); // wait until receive buffer is not empty
temp = SPI1->DR;
result = (result*256) temp;
chars_to_read--;
}
delay();
SPI1_NSS = DESELECT_CHIP; // set the SS pin high
return resu<
}
static void delay(void)
{
unsigned int j = FALSE;
for (j = 0; j < 25; j ) {
}
}
Комментарии:
1. RXNE и TXE — это флаги, определяющие состояние буфера . Как только начнется передача первого бита, TXE повысится, поскольку буфер уже способен принять следующий байт. Это хорошо для уменьшения пауз между байтами. В некоторых случаях вам нужно будет вместо этого установить флажок BSY.