[英]How I can proper handle the SPI read register function? I am facing a debug error
我正在使用 SPI 通信協議來與 NRF 通信我的板。 我有 nucleo stm32l053r8 板。 我在 stmcubeide 工作並試圖找到一個基於 spi_read function 的配音問題。 我所做的就是從 NRF 中讀取其寄存器的復位值,例如 CONFIG、EN_AA、STATUS 等。我正在使用調試器使用斷點來查看 spi_read function 返回的值是否正確。 問題是它只返回第一個值,然后盡管我想讀取 EN_AA 寄存器,但它繼續向我發回 CONFIG 值。
所有其他功能都工作正常。
spi_read function:
uint8_t res=0;
SPI1->DR=0xff;
while(READ_BIT(SPI1->SR,SPI_SR_BSY));
while(!READ_BIT(SPI1->SR,SPI_SR_RXNE));
res = SPI1->DR;
while(READ_BIT(SPI1->SR,SPI_SR_RXNE)==1)
{
READ_REG(SPI1->DR);
}
while(!(READ_BIT(SPI1->SR,SPI_SR_TXE)));
while(READ_BIT(SPI1->SR,SPI_SR_BSY));
SPI1->DR = reg;
while(!(READ_BIT(SPI1->SR,SPI_SR_RXNE)));
READ_REG(SPI1->DR);
while(!(READ_BIT(SPI1->SR,SPI_SR_TXE)));
while(READ_BIT(SPI1->SR,SPI_SR_BSY));
SPI1->DR = 0xff;
while(!(READ_BIT(SPI1->SR,SPI_SR_RXNE))); // Wait until there is some data into the buffer before start reading.
res = SPI1->DR;
while(!(READ_BIT(SPI1->SR,SPI_SR_TXE)));
while(READ_BIT(SPI1->SR,SPI_SR_BSY));
return res;
and the main function which is for testing the spi read :
uint8_t res_1=0;
init_rcc(); // clock configurations
gpio_configure();
spi_configure();
while(1){
for (uint8_t i=0;i<4;i++){ // I want to read the first 4 register values
CS_enable();
res_1 = SPI_read(CONFIG+i); starting from CONFIG and keep going.
CS_disable();
}
}
}
如果我使用 CS_enable() 中的斷點運行它一次; 當 spi_read() 第一次工作時,它返回正確的值,之后為 8,盡管在循環中使用命令 res_1 = SPI_read(CONFIG+i); 在 spi_read 的第二次嘗試進入另一個寄存器后,它仍然返回 8,它用於寄存器 CONFIG。 我在 spi_read 步驟中缺少什么?
您對 DR 的讀寫無效。
你需要
*(uint8_t *)&SPI1->DR = reg;
res = *(uint8_t *)&SPI1->DR;
為什么? 因為這個微有 FIFO,你使用 32 位寫入訪問寄存器,FIFO 解釋為 2 個字節。
不需要您的BSY
標志測試。 如果要禁用SPI
或重新配置 DMA(以確保所有數據都已發送),則使用BSY
標志。/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.