STM32F407使用硬體SPI驅動MCP3008

2021-10-02 12:19:45 字數 2675 閱讀 5535

前段時間校企合作專案裡一塊板子上用了mcp3008,一開始老是得到值,後來終於得到了,以此來寫一下部落格分享給大家,讓大家少走彎路。言歸正傳,我們開始——

mcp3008是乙個逐漸接近的10位模擬數字轉化器, 板載取樣和保持電路. 它可程式設計, 提供四個偽差分輸入對或八個單端輸入. 微分非線性(dnl)積分非線性(inl)指定為: ±1 lsb. 通過乙個相容spi協議的簡單序列介面與裝置之間進行通訊.

通過查詢資料手冊可以看到mcp3008支援兩種spi模式:模式0 和模式3

根據上述描述編寫相關初始化**, 位於檔案bsp_spi_ad_mcp3008.c

void spi_ad_mcp3008_init(void)

這裡使用了野火的**方式,使用了巨集定義以便快速跟換spi。

通過datasheet可以知道:

一般使用不用使用差分,規則即可,即傳送獲取通道傳輸命令最高位為1後三位是通道數0~7,後四位不重要,我這裡全部為0。

spi傳送接收步驟

傳送0x01開始ad轉換

接收spi資料(無用的資料)

傳送通道傳輸命令(0x08|通道0~7)<<4

接收spi資料(第乙個位元組)

傳送0x00接收spi資料(第二個位元組)

合成得到10位ad通道轉換值

參考**

uint16_t spi_ad_mcp3008_x_read(uint8_t ad_mcp3008_x, uint8_t channe)

; uint8_t cmd_temp = channe;

uint16_t ad_value_temp = 0;

cmd_temp &= 0x07;

cmd_temp |= 0x08;

cmd_temp <<= 4;

if (ad_mcp3008_x == 0x01)

ad_mcp3008_1_cs = 0;

else if (ad_mcp3008_x == 0x02)

ad_mcp3008_2_cs = 0;

else if (ad_mcp3008_x == 0x03)

ad_mcp3008_3_cs = 0;

// delay_us(100);

/* 等待傳送緩衝區為空,txe事件 */

while (spi_i2s_getflagstatus(ad_mcp3008_spi, spi_i2s_flag_txe) == reset)

/* 寫入資料暫存器,把要寫入的資料寫入傳送緩衝區 */

spi_i2s_senddata(ad_mcp3008_spi, 0x01);//傳輸開始指令

/* 等待接收緩衝區非空,rxne事件 */

while (spi_i2s_getflagstatus(ad_mcp3008_spi, spi_i2s_flag_rxne) == reset)

/* 讀取資料暫存器,獲取接收緩衝區資料 */

data_temp[0]=spi_i2s_receivedata(ad_mcp3008_spi);//無用資料

/* 寫入資料暫存器,把要寫入的資料寫入傳送緩衝區 */

spi_i2s_senddata(ad_mcp3008_spi, cmd_temp);//傳輸通道指令

/* 等待接收緩衝區非空,rxne事件 */

while (spi_i2s_getflagstatus(ad_mcp3008_spi, spi_i2s_flag_rxne) == reset)

// delay_us(100);

/* 讀取資料暫存器,獲取接收緩衝區資料 */

data_temp[1] = spi_i2s_receivedata(ad_mcp3008_spi);

spi_i2s_senddata(ad_mcp3008_spi, 0x00);//傳輸通道指令

/* 等待接收緩衝區非空,rxne事件 */

while (spi_i2s_getflagstatus(ad_mcp3008_spi, spi_i2s_flag_rxne) == reset)

/* 讀取資料暫存器,獲取接收緩衝區資料 */

data_temp[2] = spi_i2s_receivedata(ad_mcp3008_spi);

// delay_us(100);

if ((data_temp[1] & 0x04) == 0)

ad_mcp3008_3_cs = 1;

ad_mcp3008_2_cs = 1;

ad_mcp3008_1_cs = 1;

return ad_value_temp;

}

基於stm32f407建立stm32F427工程

分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...

STM32F407上除錯freeRTOS問題

是在正點原子的阿波羅stm32f429開發板上的例子改來的,他們的編譯沒有問題,我編譯時出現如下問題 定位到出錯的地方,是 再追 configmax syscall interrupt priority 的定義是 define configmax syscall interrupt priority...

STM32F407 驅動外部SRAM

需要驅動的sram型號為is61lv25616al,價效比比51216的高很多 配置cubemx 這幾個時序比較關鍵,可以按照手冊來計算,我用下來這幾個數值比較合適。然後就沒有然後了,生成 就可以用了。檢查sram內容是否正確 uint8 t bsp testextsram void 寫sram p...