簡體   English   中英

如何正確處理 SPI 讀取寄存器 function? 我面臨調試錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM