超声波明渠流量计原理及探讨 三十八
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;
超声波流量计