📄 smb_24c256.c
字号:
case SMB_MTADDNACK:
STO = 1;
STA = 1;
break;
// Master Transmitter: Data byte transmitted. ACK received.
// This state is used in both READ and WRITE operations. Check BYTE_NUMBER
// for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
// If LOW_ADD has been sent, check COMMAND for R/W value to determine
// next state.
case SMB_MTDBACK:
switch (BYTE_NUMBER){
case 2: // If BYTE_NUMBER=2, only HIGH_ADD
SMB0DAT = LOW_ADD; // has been sent.
BYTE_NUMBER--; // Decrement for next time around.
break;
case 1: // If BYTE_NUMBER=1, LOW_ADD was just sent.
if (COMMAND & 0x01){ // If R/W=READ, sent repeated START.
STO = 0;
STA = 1;
} else {
SMB0DAT = WORD; // If R/W=WRITE, load byte to write.
BYTE_NUMBER--;
}
break;
default: // If BYTE_NUMBER=0, transfer is finished.
STO = 1;
SM_BUSY = 0; // Free SMBus
}
break;
// Master Transmitter: Data byte transmitted. NACK received.
// Slave not responding. Send STOP followed by START to try again.
case SMB_MTDBNACK:
STO = 1;
STA = 1;
break;
// Master Transmitter: Arbitration lost.
// Should not occur. If so, restart transfer.
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// Master Receiver: Slave address + READ transmitted. ACK received.
// Set to transmit NACK after next transfer since it will be the last (only)
// byte.
case SMB_MRADDACK:
AA = 0; // NACK sent on acknowledge cycle.
break;
// Master Receiver: Slave address + READ transmitted. NACK received.
// Slave not responding. Send repeated start to try again.
case SMB_MRADDNACK:
STO = 0;
STA = 1;
break;
// Data byte received. ACK transmitted.
// State should not occur because AA is set to zero in previous state.
// Send STOP if state does occur.
case SMB_MRDBACK:
STO = 1;
SM_BUSY = 0;
break;
// Data byte received. NACK transmitted.
// Read operation has completed. Read data register and send STOP.
case SMB_MRDBNACK:
WORD = SMB0DAT;
STO = 1;
SM_BUSY = 0; // Free SMBus
break;
// All other status codes meaningless in this application. Reset communication.
default:
STO = 1; // Reset communication.
SM_BUSY = 0;
break;
}
SI=0; // clear interrupt flag
}
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
//uint8 xdata EepromBuf[16];
/*********************************************************************************************************
** 函数名称: EepromReadBuf
** 功能描述: 从指定的地址开始读出指定的字节数放入缓冲区
** 输 入: address,bytenumber
** 输 出: 无
** 全局变量: EepromBuf
** 调用模块: SM_Receive
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
/*
void EepromReadBuf (uint16 address ,uint8 bytenumber)
{
uint8 data i;
if(bytenumber>16)
bytenumber=16;
for(i=0;i<bytenumber;i++)
{
EepromBuf[i] = SM_Receive(CHIP_A, address++);
}
}
/*********************************************************************************************************
** 函数名称: EepromWriteBuf
** 功能描述: 从指定的地址开始写入缓冲区内指定的字节数
** 输 入: address,bytenumber
** 输 出: 无
** 全局变量: EepromBuf OSWait
** 调用模块: SM_Send
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
/*
void EepromWriteBuf (uint16 address ,uint8 bytenumber)
{
uint8 data i;
if(bytenumber>16)
bytenumber=16;
for(i=0;i<bytenumber;i++)
{
SM_Send(CHIP_A, address++, EepromBuf[i]);
OSWait(K_TMO,(10*OS_TICKS_PER_SEC)/1000);//delay10ms
}
}
/*********************************************************************************************************
** 函数名称: EepromReadByte
** 功能描述: 从指定的地址读出一个字节数据
** 输 入: address,bytenumber
** 输 出: 所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 EepromReadByte (uint16 address)
{
return(SM_Receive(CHIP_A, address));
}
/*********************************************************************************************************
** 函数名称: EepromReadWord
** 功能描述: 从指定的地址读出一个字节数据
** 输 入: address,bytenumber
** 输 出: 所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 EepromReadWord (uint16 address)
{
uint16 data temp;
temp = EepromReadByte (address);
temp = temp<<8;
temp |= EepromReadByte (address+1);
return(temp);
}
/*********************************************************************************************************
** 函数名称: EepromWriteByte
** 功能描述: 在指定的地址写入指定的字节
** 输 入: address,temp
** 输 出: 无
** 全局变量:
** 调用模块: SM_Send
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteByte(uint16 address ,uint8 temp)
{
SM_Send(CHIP_A, address, temp);
OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
}
/*********************************************************************************************************
** 函数名称: EepromWriteWord
** 功能描述: 在指定的地址写入指定的字节
** 输 入: address,temp16
** 输 出: 无
** 全局变量:
** 调用模块: SM_Send
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteWord(uint16 address ,uint16 temp16)
{
SM_Send(CHIP_A, address++, (uint8)(temp16>>8));
OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
SM_Send(CHIP_A, address, (uint8)(temp16));
OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -