應用PIC16F1938中IIC讀取LM75A溫度
一.概述
LM75A是一個高精度溫度傳感器,精度高達0.125℃,可以采集的溫度範圍是-55℃~125℃。PIC16F1938可以通過IIC通信方式對LM75A裏面的溫度寄存器直接讀取,並可設置相關的配置寄存器。每個LM75A的地址信號前四位是一樣的(由不同生產廠家決定1001),有三位可選的邏輯地址管腳(A0,A1,A2),因此IIC總線上可以支持同時掛載8個LM75A芯片。LM75A有不同的工作模式,正常模式下是監控環境溫度,通過IIC總線讀取;OS輸出模式有兩種可選的工作模式:OS比較模式和OS中斷模式,OS輸出高低電平來判斷溫度是否超過設定閾值,默認情況下溫度閾值為80℃,滯後溫度閾值為75
二.LM75A管腳
三.LM75A內部寄存器
1.溫度寄存器Temp(地址0x00)
溫度寄存器中一共有兩個數據字節,高數據字節(MS)和低數據字節(LS),其中高數據字節是溫度數據的整數部分範圍為-25℃~到+125℃,高數據字節第7位是符號位。低數據字節只有高三位有效,即將1℃分為8份,所以精度為0.125℃。
下面是手冊上給出的一些溫度值示例。
2.配置寄存器Conf(地址0x01)
配置寄存器為8位可讀可寫寄存器,功能如下。
B7~B5 |
B4~B3 |
B2 |
B1 |
B0 |
保留 |
OS故障列隊 |
OS極性 |
OS比較/中斷 |
關斷 |
OS故障列隊:用於故障列隊編程,0,1,2,3,代表隊列值1,2,4,6,默認是0;
OS極性:有效電平選擇,1代表OS高有效,0代表OS低有效;
OS比較/中斷:比較中斷模式選擇,1代表OS工作與中斷模式,0代表OS工作於比較模式。
關斷:期間模式選擇,1代表關斷,0代表正常模式。
3.滯後溫度寄存器Thyst(地址0x02)
滯後溫度寄存器可讀可寫,提供了溫度下限溫度,默認為75℃。每次采樣溫度到Temp中和下限溫度比較,低於下限溫度會在OS腳做出相應反應。
4.過溫關斷門限溫度寄存器Tos(地址0x03)
過溫關斷門限溫度寄存器可讀可寫,提供了溫度上限溫度,默認為80℃。每次采樣溫度到Temp中和上限溫度比較,高於下限溫度會在OS腳做出相應反應。過溫關斷門限溫度寄存器和滯後溫度寄存器均用9位來存儲溫度,分辨率為0.5℃,數據格式如下;
D15 |
D14~D8 |
D7 |
D6~D0 |
符號位 |
溫度值 |
保留 |
5.地址寄存器Address
地址寄存器的定義如下;
A7~A4 |
A3~A1 |
A0 |
1001 |
可選邏輯地址 |
讀/寫 |
A7~A0為固定地址,廠家決定為1001;A3~A1可選地址,對應LM75A的三個地址引腳;A0為讀/寫功能位,1為讀取,0位寫入。
四.PIC16F1938的IIC通訊模塊
內部集成電路總線(I²C)是多主器件串行數據通信總線。器件可以在主/ 從環境下通信,在該環境下,由主器件發起通信。可通過尋址控制從器件。IIC總線指定兩種信號連接:串行時鐘(SCL)和串行數據(SDA)。
1.PIC16F1938配置IIC
將PIC16F1938中的主同步串行端口(MSSP)配置為IIC工作的主發送模式(通過將SSPCON1寄存器中的SSPM置1並將SSPEN置1),主模式下,SCL和SDL均有MCU控制,用戶需要將RC3和RC4引腳設為輸入(TRISC3 置1;TRISC4 置 1;),設置SCL上的時鐘頻率(通過SSPADD寄存器來設置)
2. PIC16F1938中IIC模塊主模式發送序列
- 用戶通過將SSPCON2 寄存器的SEN 位置1 來產生啟動條件。
- 啟動條件完成時, SSPIF 由硬件置1。
- SSPIF 由軟件清零。
- 在發生任何其他操作之前,MSSP 模塊將等待所需的啟動時間。
- 用戶將要發送的從地址裝入SSPBUF。
- 地址將移出SDA 引腳,直到所有8 位發送完畢。寫SSPBUF 時便開始發送。
- MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
- 在第9 個時鐘周期結束時, MSSP 模塊通過將SSPIF 位置1 產生中斷。
- 用戶將8 位數據裝入SSPBUF。
- 數據被移出SDA 引腳,直到所有8 位發送完畢。
- MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
- 對於所有發送的數據字節,重復第8-11 步。
- 用戶通過將SSPCON2 寄存器的PEN 或RSEN位置1 來產生停止或重復啟動條件。停止/ 重復啟動條件完成時產生中斷。
3. PIC16F1938中IIC模塊主模式接受序列
- 用戶通過將SSPCON2 寄存器的SEN 位置1 來產生啟動條件。
- 啟動條件完成時, SSPIF 由硬件置1。
- SSPIF 由軟件清零。
- 用戶將要發送的從地址寫入SSPBUF 且R/W 位置1。
- 地址將移出SDA 引腳,直到所有8 位發送完畢。寫SSPBUF 便開始發送。
- MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
- 在第9 個時鐘周期結束時, MSSP 模塊通過將SSPIF 位置1 產生中斷。
- 用戶將SSPCON2 寄存器的RCEN 位置1,且主器件隨著時鐘移入來自從器件的字節。
- 在SCL 信號的第8 個下降沿之後,SSPIF 和BF置1。
- 主器件清零SSPIF,並從SSPUF 中讀取接收到的字節,清零BF 位。
- 主器件在SSPCON2 寄存器的ACKDT 位中設置將要發送給從器件的ACK 值,並通過將ACKEN位置1 發送ACK。
- 主器件隨著時鐘將ACK 移出到從器件, SSPIF置1。
- 用戶清零SSPIF。
- 對於每個從從器件接收的字節,重復第8-13 步。
- 主器件發送非ACK 或停止位以結束通信。
五.使用PIC16F1936讀取LM75A溫度值
從上面的讀取可以看到PIC16F1936的IIC模塊每次讀取8位,二LM75A的溫度數據是兩個8位存放在一個地址裏面,因此需要讀取1個字節數據後應答0,再接收第2個數據後主機應答1來停止通過過程。具體讀寫C語言代碼如下:
unsigned char IIC_Read_Byte(void)
{
//Read one byte
unsigned char b;
RCEN = 1; //使能IIC接收模式
while (!SSPIF);
SSPIF = 0;
b = SSPBUF;
BF = 0;
return b;
}
void IIC_Write_Byte(unsigned char d)
{
SSPBUF = d; //將從機地址裝入SSPBUF進行傳送,以準備進行數據讀
while (!SSPIF); //等待發送結束
SSPIF = 0; //SSPIF標誌清0
}
void IIC_ACK(unsigned char x)
{
//The master ACK 0 or 1
ACKDT = (x & 0x01); //ACK 0 or 1, 0 is active
ACKEN = 1; //在SDA和SCL引腳上啟動應答順序,並發送ACKDT數據位
while (!SSPIF); //等待應答發送結束
SSPIF = 0; //SSPIF標誌清0
}
void IIC_Start(void)
{
SEN = 1; // Start signal
do
{
RSEN = 1;
}
while (!SSPIF); //等待啟動結束,如果沒啟動,反復重啟動
SSPIF = 0; //SSPIF標誌清0
}
void IIC_Stop(void)
{
PEN = 1; //產生IIC停止信號
while (!SSPIF); //等待發送結束
SSPIF = 0; //SSPIF標誌清0
}
unsigned int IIC_Read_LM75A(void)
{
unsigned char bytebuf1 = 0;
unsigned char bytebuf2 = 0;
unsigned int temp=0;
IIC_Start();
IIC_Write_Byte(0x91);
bytebuf1 = IIC_Read_Byte();
IIC_ACK(0);
bytebuf2 = IIC_Read_Byte();
IIC_ACK(1);
IIC_Stop();
temp= bytebuf1*256+ bytebuf2;
return temp;
}
應用PIC16F1938中IIC讀取LM75A溫度