ADS1015+STM32F407傳感器通信

目的

在使用ADS1015傳感器時出現了一些問題,記錄下,方便將來查看使用。javascript

ADS1015介紹以下

在這裏插入圖片描述

硬件部分

ADS1015引腳功能,以及電路圖如圖所示。我使用的是右邊那個。
在這裏插入圖片描述
在這裏插入圖片描述
ADS1015也能夠同時使用多片,接線方式如圖,地址爲下方講到。
在這裏插入圖片描述java

軟件部分

地址位的選擇

在數據手冊中能夠看到,由管腳ADDR進行選擇,默認懸空時由內部下拉電阻控制,即地址位1001000,可是實際上咱們一般會後面加一位0。(後面會講到)至於其餘地址相似與此。
在這裏插入圖片描述web

讀寫數據時序圖

讀寫數據介紹

在這裏插入圖片描述

讀數據時序圖

在這裏插入圖片描述

寫數據時序圖

在這裏插入圖片描述

程序結構

因爲在實際使用中,ADS1015常切換通道,因此常在配置寄存器和數據寄存器中切換,因此分紅兩種方式,一種是須要切換的,每次須要寫入要讀取的寄存器才能讀取到數據寄存器,一種是固定的配置後,一直是讀取數據寄存器,則無需寫入,少去步驟1,2。svg

  • ADS1015在讀取數據時主要步驟爲:
  1. 向傳感器發送 寄存器地址+讀寫控制位 。(這就是爲何上方說到實際上 地址位 加上一位,也能夠理解網上的一寫程序將地址設置爲 90H)
  2. 向寄存器 Address Pointer Register 寄存器寫入要讀取的寄存器.
  3. 重複步驟一,可是注意!步驟一針對步驟二,是寫入!!!可是步驟三針對步驟四,是讀取。故此步驟一發送(90H|00H),步驟三發送(90H|01H)也能夠見邏輯儀採集的圖。
  4. 讀取數據高字節。
  5. 讀取數據低字節。
    在這裏插入圖片描述
    實際運行,讀取數據如上圖所示,其中00表明數據寄存器。1160是讀取的數據寄存器的值。注意其中數據寄存器最後4位爲無效位。在這裏插入圖片描述
  • ADS1015在寫數據時主要步驟爲:
  1. 向傳感器發送 寄存器地址+讀寫控制位
  2. 向寄存器 Address Pointer Register 寄存器寫入要寫入的寄存器.
  3. 寫入數據高字節。
  4. 寫入數據低字節。

在這裏插入圖片描述
具體寫入數據波形如上圖, 其中D393爲配置寄存器值。
在這裏插入圖片描述
在這裏插入圖片描述ui

出現的異常問題

在調試過程當中,起先不曉得爲啥子,數據讀出來的總是亂碼那種,起先個人iic協議也是隨便找的一個修改的。出現了以下問題,在讀取數據時,90H00H91H時都很正常,芯片也正常應答了,可是到讀取數據時莫名其妙的異常了。在查找一番後。修改了接收部分程序,加入一延時,在程序中的註釋後加入那個延時,程序正常。
在這裏插入圖片描述spa

/** * @brief IIC讀取1byte數據 * @param None * @retval None * @note */
uint8_t iic_readbyte(unsigned char ack)
{
    uint8_t i;
    uint8_t recv_value = 0;
    IIC1_SDA(GPIO_PIN_SET);		
    iic_delay(2);	  
	
	  SDA_IN();//SDA設置爲輸入
    for (i = 0; i < 8; i++)
    {
        IIC1_SCL(GPIO_PIN_SET);
        iic_delay(10);
        recv_value <<= 1;
        if (IIC1_SDA_IS_HIGH())
        {
            recv_value |= 0x01;
        }
        else
        {
            recv_value &= ~0x01;
        }
				iic_delay(2);
				IIC1_SCL(GPIO_PIN_RESET);
************************************************************************
				iic_delay(10);//後加入
************************************************************************

    }
	  SDA_OUT();     //sda線輸出
		
		if (!ack)
        iic_nack();//發送nACK
    else
        iic_ack(); //發送ACK 
    return recv_value;
}

修改程序後,波形正常,數據正常。
在這裏插入圖片描述3d