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

📄 i2c_24cxx.c

📁 用quartusII编写的
💻 C
字号:
/*****************************************************************************
                    用51单片机读写I2C总线存储器24CXX的程序

     最近更新日期:

            2004-3-24 16:41   基本功能在AT24C02,AT24C16上调试通过

            2005-1-20 8:56    为了让本程序能用于多任务系统,为其增加临界区保护措施
      (即OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL())

*****************************************************************************/

#include "..\..\includes.h"

#if CFG_I2C_24CXX_EN > 0

//-------------------------------------------------------------------------
// 向没有器件内部子地址的器件发送一个字节数据
//
// 参数:
//      slaveAddress     器件地址
//      ch               要发送的数据
//
// 返回值:
//      如果发送数据成功,返回TRUE;否则,返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_WriteByte( INT8U slaveAddress, INT8U ch )
{
#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR   cpu_sr;
#endif

      OS_ENTER_CRITICAL();

      // 因为这是写操作,所以要将slaveAddress的bit0设置为0
      slaveAddress &= 0xfe;

      I2C_Start();        // 启动I2C总线


      if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      if( I2C_SendByte( ch ) == FALSE )           // 发送数据
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }

      I2C_Stop();        // 结束I2C总线

      OS_EXIT_CRITICAL();

      return TRUE;
}



//-------------------------------------------------------------------------
// 向有器件内部子地址的器件发送多字节数据
//
// 参数:
//      slaveAddress     器件地址
//      startAddress     器件的内部子地址
//      *str             要发送多字节数据
//      length           发送的多字节数据长度
//
// 返回值:
//      如果发送多字节数据成功,函数返回TRUE;失败,函数返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_WriteMultiBytes( INT8U slaveAddress,
                             INT8U startAddress,
                             INT8U *str,
                             INT8U length )
{
#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR   cpu_sr;
#endif

      INT8U i;

      OS_ENTER_CRITICAL();

      // 因为这是写操作,所以要将slaveAddress的bit0设置为0
      slaveAddress &= 0xfe;


      I2C_Start();        // 启动I2C总线


      if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      if( I2C_SendByte( startAddress ) == FALSE ) // 发送器件的内部子地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      // 发送多字节数据
      for( i=0; i<length; i++ )
      {
            if( I2C_SendByte( str[i] ) == FALSE )
            {
                  OS_EXIT_CRITICAL();
                  return FALSE;
            }
      }


      I2C_Stop();        // 结束I2C总线

      OS_EXIT_CRITICAL();

      return TRUE;
}






//-------------------------------------------------------------------------
// 从没有器件内部子地址的器件中读取一个字节数据
//
// 参数:
//      slaveAddress     器件地址
//      *ch              保存读取的数据
//
// 返回值:
//      如果读取数据成功,函数返回TRUE, 用形参*ch保存读取的数据
//      如果读取数据失败,函数返回FALSE,形参*ch为0
//-------------------------------------------------------------------------
extern BOOLEAN I2C_ReadByte( INT8U slaveAddress, INT8U *ch )
{
#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR   cpu_sr;
#endif

      OS_ENTER_CRITICAL();

      // 因为这是读操作,所以要将slaveAddress的bit0设置为1
      slaveAddress |= 0x01;

      I2C_Start();        // 启动I2C总线


      if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }

      *ch = I2C_ReceiveByte();    // 读取数据

      I2C_UnACK();       // 发送非ACK应答信号

      I2C_Stop();        // 结束I2C总线

      OS_EXIT_CRITICAL();

      return TRUE;
}






//-------------------------------------------------------------------------
// 从有器件内部子地址的器件中读取多字节数据
//
// 参数:
//      slaveAddress     器件地址
//      startAddress     器件的内部子地址
//      *str             读取的多字节数据保存到str指向的存储空间
//      length           要读取的多字节数据长度
//
// 返回值:
//      如果读取多字节数据成功,函数返回TRUE;失败,函数返回FALSE
//-------------------------------------------------------------------------
extern BOOLEAN I2C_ReadMultiBytes(  INT8U slaveAddress,
                             INT8U startAddress,
                             INT8U *str,
                             INT8U length )
{
#if OS_CRITICAL_METHOD == 3
      OS_CPU_SR   cpu_sr;
#endif

      INT8U i;

      if( length==0 )
            return FALSE;

      OS_ENTER_CRITICAL();


      // 执行一次虚拟写操作
      // 因为首先要虚拟写,所以要将slaveAddress的bit0设置为0
      slaveAddress &= 0xfe;

      I2C_Start();        // 启动I2C总线


      if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      if( I2C_SendByte( startAddress ) == FALSE ) // 发送器件的内部子地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      // 再一次启动
      // 这次启动才是真正的读,所以,要将slaveAddress的bit0设置为1
      slaveAddress |= 0x01;

      I2C_Start();        // 启动I2C总线

      if( I2C_SendByte( slaveAddress ) == FALSE ) // 发器件地址
      {
            OS_EXIT_CRITICAL();
            return FALSE;
      }


      // 接收多字节数据
      for( i=0; i<length-1; i++ )
      {
            str[i] = I2C_ReceiveByte();    // 读取数据

            I2C_ACK();
      }

      str[i] = I2C_ReceiveByte();    // 读取数据

      I2C_UnACK();

      I2C_Stop();                    // 结束I2C总线

      OS_EXIT_CRITICAL();

      return TRUE;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -