2021/9/7 ad9361 SPI 通信与数据接口
之前做過這部分工作,沒有整理,現在回顧一下。
當FPGA 版本出來之后,怎么讓AD9361 動起來 ,就是頭等大事。當時十分在意,SPI是否通了?
AD9361收發器包括一個使能狀態機(ENSM),允許對器件的當前狀態進行實時控制。在正常運行過程中,器件可以置于多種不同狀態,包括
? ? ? ?? 待機—節能,頻率合成器被禁用
? ? ? ?? 休眠—待機,所有時鐘/BB PLL被禁用
? ? ? ?? TX—TX信號鏈被使能
? ? ? ?? RX—RX信號鏈被使能
? ? ? ?? FDD—TX和RX信號鏈被使能
? ? ? ?? 報警—頻率合成器被使能
? ? ? 上圖中灰色狀態不需要用戶控制,經過設定的時間后進入下一個狀態。TO_ALERT位在ENSM配置寄存器中,如果要切換到WAIT狀態,需要在RX或TX狀態下清除TO_ALERT位,這樣從 Rx, Tx或FDD狀態移出時,ENSM將轉移到WAIT狀態,如果TO_ALERT被置1,ENSM將轉換到ALERT 狀態。
ENSM有兩種可能的控制方法:SPI控制和引腳控制。
1)通過SPI寫寄存器將當前狀態推進到下一個狀態,可以異步控制ENSM。
2)使用ENABLE和TXNRX引腳實時控制當前狀態
2.SPI控制
? ? ? ? 在SPI控制模式下,通過寫SPI寄存器,從當前狀態進入下一狀態,從而實現對ENSM的異步控制。SPI控制被認為與DATA_CLK異步,因為SPI_CLK可能派生自一個不同的參考時鐘,而且仍然能正常工作。當不需要對頻率合成器進行實時控制時,推薦采用SPI控制ENSM法。只要BBIC能夠精確執行SPI寫操作,SPI控制就可以用于實時控制。
? ? ?SPI接口
AD9361通過一個串行外設接口(SPI)與BBP通信。該接口可以配置為4線接口,帶有專門的接收和發射端口,也可以配置為3線接口,帶一個雙向數據通信端口。該總線允許BBP通過一種簡單地址數據串行總線協議,設置所有器件控制參數。
?? ? 數據格式
?分為3線模式和4線模式 控制字段由16bit組成,[15]為讀寫標志,高位讀;[14:12]為讀寫的Byte數1~8Byte;[11:10]未使用;[9:0]為讀寫的起始字節地址;
前6位用于設置總線方向和需要傳輸的字節數。接下來的10位數據的寫入地址。
/* * SPI Comm Helpers */ #define AD_READ (0 << 15) #define AD_WRITE (1 << 15) #define AD_CNT(x) ((((x) - 1) & 0x7) << 12) #define AD_ADDR(x) ((x) & 0x3FF)? ? ? 寫命令
最后8位是將被傳輸至指定寄存器地址(MSB至LSB)的數據。AD9361還支持LSB優先格式,允許命令以LSB至MSB格式寫入。在該模式下,對于多字節寫命令,寄存器地址將遞增。
/*** SPI register write.* @param spi* @param reg The register address.* @param val The value of the register.* @return 0 in case of success, negative error code otherwise.*/ int32_t ad9361_spi_write(struct spi_device *spi, uint32_t reg, uint32_t val) {uint8_t buf[3];int32_t ret;uint16_t cmd;//uart_printf("ad9361_spi_write:reg[%d] = 0x%x\r\n",reg,val);cmd = AD_WRITE | AD_CNT(1) | AD_ADDR(reg);buf[0] = cmd >> 8;buf[1] = cmd & 0xFF;buf[2] = val;ret = spi_write_then_read(spi, buf, 3, NULL, 0);if (ret < 0) {dev_err(&spi->dev, "Write Error %"PRId32, ret);return ret;}return 0; }? ? ?讀命令
遵循相似的格式,區別在于,前16位在SPI_DI引腳上傳輸,最后8位從AD9361中讀取,如果是4線模式,則在SPI_DO引腳上完成,如果是3線模式,則在SPI_DI引腳上完成。
/*** SPI multiple bytes register read.* @param spi* @param reg The register address.* @param rbuf The data buffer.* @param num The number of bytes to read.* @return 0 in case of success, negative error code otherwise.*/ int32_t ad9361_spi_readm(struct spi_device *spi, uint32_t reg,uint8_t *rbuf, uint32_t num) {uint8_t buf[2];int32_t ret;uint16_t cmd;if (num > MAX_MBYTE_SPI)return -EINVAL;cmd = AD_READ | AD_CNT(num) | AD_ADDR(reg);buf[0] = cmd >> 8;buf[1] = cmd & 0xFF;ret = spi_write_then_read(spi, &buf[0], 2, rbuf, num);if (ret < 0) {dev_err(&spi->dev, "Read Error %"PRId32, ret);return ret;}return 0; }?SPI時序
3.? SPI? 模式
官方選的 SPI 模式2,? 也就是 下降沿 為數據的開始,第一個跳變沿采樣
總結
以上是生活随笔為你收集整理的2021/9/7 ad9361 SPI 通信与数据接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给楠哥准备的入门单片机
- 下一篇: python 异步定时任务