⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smb_24c256.c

📁 一个分选系统的软件:用SmallRtos操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -