前段時間校企合作專案裡一塊板子上用了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...