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