超聲波明渠流量計(jì)原理及探討 三十八
SMBus 總線提供了28 種反饋狀態(tài),來控制數(shù)據(jù)的傳輸。下面為常用的12 狀態(tài)的寄存器值:
#define SMB_BUS_ERROR 0x00 // 總線錯(cuò)誤(出現(xiàn)非法的起始位或停止位)
#define SMB_START 0x08 // 起始位發(fā)送成功
#define SMB_RP_START 0x10 // 重復(fù)起始位發(fā)送成功
#define SMB_MTADDACK 0x18 // 從機(jī)地址+寫控制發(fā)送成功,且收到ACK 應(yīng)答
#define SMB_MTADDNACK 0x20 // 從機(jī)地址+寫控制發(fā)送成功,收到NACK,
即從機(jī)無應(yīng)答
#define SMB_MTDBACK 0x28 // 數(shù)據(jù)放送成功,且收到ACK 應(yīng)答
#define SMB_MTDBNACK 0x30 // 數(shù)據(jù)發(fā)送成功,收到NACK
#define SMB_MTARBLOST 0x38 // 總線競(jìng)爭(zhēng)失敗
#define SMB_MRADDACK 0x40 // 從機(jī)地址+讀控制成功發(fā)送,收到ACK
#define SMB_MRADDNACK 0x48 // 從機(jī)地址+讀控制成功發(fā)送,收到NACK
#define SMB_MRDBACK 0x50 // 數(shù)據(jù)接收成功,ACK 成功發(fā)送
#define SMB_MRDBNACK 0x58 // 數(shù)據(jù)接收成功,NACK 成功發(fā)送
具體程序如下:
對(duì)鐵電存儲(chǔ)器的寫操作程序?yàn)椋?span lang="EN-US">
void SM_Send (char chip_select,unsigned int byte_address, char out_byte)
{
while (SM_BUSY); //等待總線空閑
SM_BUSY=1; //占用總線
SFRPAGE=0X00;
SMB0CN=0x44; // SMBus 總線使能,
在應(yīng)答周期回應(yīng)ACK
BYTE_NUMBER=2; // 兩字節(jié)地址
COMMAND=(chip_select | WRITE); // 片選+寫信號(hào)
HIGH_ADD=((byte_address >> 8) & 0x00FF); // 高8 位地址
LOW_ADD=(byte_address & 0x00FF); // 低8 位地址
WORD=out_byte; // 要寫入的數(shù)據(jù)
STO=0;
STA=1; // 開始傳輸
對(duì)鐵電存儲(chǔ)器的讀操作程序?yàn)椋?span lang="EN-US">
char SM_Receive (char chip_select, unsigned int byte_address)
while (SM_BUSY); // 等待總線空閑
SM_BUSY=1; // 占用總線
SFRPAGE=0X00;
SMB0CN=0x44; // SMBus 總線使能,
在應(yīng)答周期回應(yīng)ACK
BYTE_NUMBER=2; // 兩字節(jié)地址
COMMAND=(chip_select | READ); // 片選+讀信號(hào)
HIGH_ADD=((byte_address >> 8) & 0x00FF); // 高8 位地址
LOW_ADD=(byte_address & 0x00FF); // 低8 位地址
STO=0;
STA=1; // 開始傳輸
while (SM_BUSY); // 等待傳輸結(jié)束
returnWORD;
超聲波流量計(jì)