посылаю-принимаю по СПИ
Код
uint32_t SPI_TransferByte(uint32_t spi_num, uint8_t tx_data, uint8_t *rx_data)
{
uint32_t timeout;
uint32_t value;
// Assert CS0, Use config 0
SPIx[spi_num]->PUSHR = SPI_PUSHR_CTAS(0) | SPI_PUSHR_TXDATA((uint32_t)tx_data);
timeout = 0;
// while transfer complete
while (!(SPIx[spi_num]->SR & SPI_SR_TCF_MASK))
{
timeout++;
if (timeout > SPI_TIMEOUT)
{
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
return SPI_TIMEOUT_ERROR;
}
};
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
*rx_data = (uint8_t)SPIx[spi_num]->POPR;
return 0;
}
вижу фигня какя то - раз получил байт в ответ, раз не получил. а на скопе на пине SIN все четко, байты приходят. думал-гадал - добавил задержку {
uint32_t timeout;
uint32_t value;
// Assert CS0, Use config 0
SPIx[spi_num]->PUSHR = SPI_PUSHR_CTAS(0) | SPI_PUSHR_TXDATA((uint32_t)tx_data);
timeout = 0;
// while transfer complete
while (!(SPIx[spi_num]->SR & SPI_SR_TCF_MASK))
{
timeout++;
if (timeout > SPI_TIMEOUT)
{
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
return SPI_TIMEOUT_ERROR;
}
};
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
*rx_data = (uint8_t)SPIx[spi_num]->POPR;
return 0;
}
Код
uint32_t SPI_TransferByte(uint32_t spi_num, uint8_t tx_data, uint8_t *rx_data)
{
uint32_t timeout;
uint32_t value;
// Assert CS0, Use config 0
SPIx[spi_num]->PUSHR = SPI_PUSHR_CTAS(0) | SPI_PUSHR_TXDATA((uint32_t)tx_data);
timeout = 0;
// while transfer complete
while (!(SPIx[spi_num]->SR & SPI_SR_TCF_MASK))
{
timeout++;
if (timeout > SPI_TIMEOUT)
{
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
return SPI_TIMEOUT_ERROR;
}
};
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
for (timeout = 0; timeout < 100; timeout++);
//while (!(SPIx[spi_num]->SR & SPI_SR_RFDF_MASK)) //dosen't work
*rx_data = (uint8_t)SPIx[spi_num]->POPR;
return 0;
}
и все работает как часики.{
uint32_t timeout;
uint32_t value;
// Assert CS0, Use config 0
SPIx[spi_num]->PUSHR = SPI_PUSHR_CTAS(0) | SPI_PUSHR_TXDATA((uint32_t)tx_data);
timeout = 0;
// while transfer complete
while (!(SPIx[spi_num]->SR & SPI_SR_TCF_MASK))
{
timeout++;
if (timeout > SPI_TIMEOUT)
{
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
return SPI_TIMEOUT_ERROR;
}
};
// clear flag
SPIx[spi_num]->SR = SPI_SR_TCF_MASK;
for (timeout = 0; timeout < 100; timeout++);
//while (!(SPIx[spi_num]->SR & SPI_SR_RFDF_MASK)) //dosen't work
*rx_data = (uint8_t)SPIx[spi_num]->POPR;
return 0;
}
фига се думаю - байт ушел но нужно ждать пока пришедший байт готов. но не задержками же.
начал перебирать флаги в статусном регистре - этот вроде подходит - while (!(SPIx[spi_num]->SR & SPI_SR_RFDF_MASK)) но я не выхожу из while. Че там твориться вообще с Кинетисовским СПИ? Или я что то не так настроил?