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

📄 24c04.lst

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   24C04                                                                 05/18/2008 16:43:11 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 24C04
OBJECT MODULE PLACED IN 24c04.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 24c04.C LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          * 版权所有(c) 豪恩科技有限公司
   3          *
   4          * 文件名称: 24C04.H
   5          * 文件标识:
   6          * 内容摘要: 24C04的基本读写程序。但没有定义SDA,SCL。
   7          *            先定义SDA,SCL。还需要定义24C04的A2,A1。
   8          *            再包含该文件。
   9          *            函数有, I2CStart , I2CStop ,
  10          * 其他说明: 所有子函数要求在退出时统一都保证SCL为高,带返回值的,成功返回0,失败返回1
  11          * 当前版本: 00.000
  12          * 作    者: 涂常亮
  13          * 完成日前: 2005
  14          *  修改记录1:
  15          *     修改日期:
  16          *     版 本 号:
  17          *     修 改 人:
  18          *     修改内容:
  19          *  修改记录2:
  20          *******************************************************************************/
  21          #include <intrins.h>
  22          #include<reg54.h>
  23          
  24          //#define USE_SEQ_RD
  25          
  26          //定义 24C04_H不合理 ???
  27          #ifndef AT24C04_H
  28          #define AT24C04_H
  29          
  30              #ifdef ADD_24C04_A2A1
                  #define ADD_WRITE_24C04 0xA0 | ADD_24C04_A2A1
                  #define ADD_READ_24C04 0xA1 | ADD_24C04_A2A1
                  #else
  34              #define ADD_WRITE_24C04 0xA0
  35              #define ADD_READ_24C04 0xA1
  36              #endif
  37          
  38          //定义24C04的响应等待时间,Datasheet是10ms,
  39          #define WAIT_ACK_TIME 11
  40          
  41          //读写24C04的返回值
  42          #define WR_SUCC_RTN 0
  43          #define RD_SUCC_RTN 0
  44          #define WR_FAIL_RTN 0xFF
  45          #define RD_FAIL_RTN 0xFF
  46          #define ERR_TIME_OV 1
  47          #define ERR_ILLEGAL_ADD 2
  48          //写入后读出值和写入值不同
  49          #define ERR_WRT_WRONG_RESULT 1
  50          //连续读时地址超出范围
  51          #define ERR_ADD_OV
  52          
  53          sbit pin_SCL = P1^3;
  54          sbit pin_SDA = P1^4;
  55          //sbit pin_WP  = P4^1;
C51 COMPILER V8.02   24C04                                                                 05/18/2008 16:43:11 PAGE 2   

  56          
  57          #define SDA pin_SDA
  58          #define SCL pin_SCL
  59          
  60          extern volatile unsigned char idata g_ucTimer24C04Ack;
  61          extern bit g_FlagWaiting24C04Ack;
  62          
  63          void I2CStart(void);
  64          void I2CStop(void);
  65          bit  ReadAck(void);
  66          void SendAck(void);
  67          void Send8Bit(unsigned char uc8BitSend);
  68          unsigned char Recev8Bit(void);
  69          bit  WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite);
  70          unsigned char ReadByte(unsigned int uiAddRead);
  71          unsigned char PageWrite(unsigned char const idata *pucDataWrt,
  72                                  unsigned int uiAddStart_PgWr,
  73                                  unsigned char ucLength_PgWr);
  74          unsigned char PageFill(unsigned char const idata ucDataPgFill,
  75                                 unsigned int uiAddStart_Fill,
  76                                 unsigned char ucLengthFill);
  77          bit SeqRead(unsigned int uiAddStart_SqRd, unsigned char ucLength_SqRd,
  78                      unsigned char *pucDataStr);
  79          
  80          /*******************************************************************************
  81          * 函数名称: void I2CStart(void);
  82          * 功能描述: 发送I2C起始位
  83          * 输入参数: 无
  84          * 输出参数: 无
  85          * 返 回 值: 无
  86          * 其他说明:
  87          * 修改日期       版 本 号        修 改 人        修改内容
  88          *-------------------------------------------------------------------------------
  89          *
  90          *******************************************************************************/
  91          void I2CStart(void)
  92          {
  93   1          //SCL = 0;    //在多机时有用
  94   1          //_nop_();
  95   1          SDA = 1;
  96   1          _nop_();
  97   1          SCL = 1;
  98   1          _nop_();
  99   1          SDA = 0;
 100   1          SCL = 0;
 101   1      }
 102          
 103          /*******************************************************************************
 104          * 函数名称:  void I2CStop(void)
 105          * 功能描述: 发送I2C停止位
 106          * 输入参数: 无
 107          * 输出参数: 无
 108          * 返 回 值: 无
 109          * 其他说明:
 110          * 修改日期       版 本 号        修 改 人        修改内容
 111          *-------------------------------------------------------------------------------
 112          *
 113          *******************************************************************************/
 114          void I2CStop(void)
 115          {
 116   1          SCL = 0;
 117   1          _nop_();
C51 COMPILER V8.02   24C04                                                                 05/18/2008 16:43:11 PAGE 3   

 118   1          SDA = 0;
 119   1          _nop_();
 120   1          SCL = 1;
 121   1          _nop_();
 122   1          SDA = 1;
 123   1      }
 124          
 125          /*******************************************************************************
 126          * 函数名称: bit  ReadAck(void);
 127          * 功能描述: 主机读取I2C总线的应答信号
 128          * 输入参数: 无
 129          * 输出参数: 无
 130          * 返 回 值: 位变量,应答期间SDA的为高返回1,为低返回0
 131          * 其他说明:
 132          * 修改日期       版 本 号        修 改 人        修改内容
 133          *-------------------------------------------------------------------------------
 134          *
 135          *******************************************************************************/
 136          bit  ReadAck(void)
 137          {
 138   1          bit FlagAck;
 139   1          //SCL = 0;
 140   1          SDA = 1;
 141   1          _nop_();
 142   1          SCL = 1;
 143   1          _nop_();
 144   1          FlagAck = SDA;
 145   1          SCL = 0;
 146   1          return (FlagAck);
 147   1      }
 148          
 149          /*******************************************************************************
 150          * 函数名称: void Send8Bit(unsigned char uc8BitSend);
 151          * 功能描述: 在I2C总线上发送一个字节
 152          * 输入参数: 1个字节的发送数据
 153          * 输出参数: 无
 154          * 返 回 值: 位变量。
 155          * 其他说明:
 156          * 修改日期       版 本 号        修 改 人        修改内容
 157          *-------------------------------------------------------------------------------
 158          *
 159          *******************************************************************************/
 160          void Send8Bit(unsigned char uc8BitSend)
 161          {
 162   1          unsigned char idata i;
 163   1          for (i = 8; i != 0; i--)
 164   1          {
 165   2              //SCL = 0;
 166   2              uc8BitSend += uc8BitSend;
 167   2              SDA = CY;//SDA = uc8BitSend &0x80;
 168   2              SCL = 1;
 169   2              _nop_();
 170   2              SCL = 0;
 171   2          }
 172   1      }
 173          
 174          /*******************************************************************************
 175          * 函数名称: unsigned char Recev8Bit(void);
 176          * 功能描述: 接收8位数据
 177          * 输入参数: 无
 178          * 输出参数: 无
 179          * 返 回 值: 接收到的8位数据
C51 COMPILER V8.02   24C04                                                                 05/18/2008 16:43:11 PAGE 4   

 180          * 其他说明:
 181          * 修改日期      版 本 号        修 改 人        修改内容
 182          *-------------------------------------------------------------------------------
 183          *
 184          *******************************************************************************/
 185          unsigned char Recev8Bit(void)
 186          {
 187   1          unsigned char idata i;
 188   1          unsigned char idata uc8BitRecev = 0;
 189   1          for (i = 8; i != 0; i--)
 190   1          {
 191   2              //SCL = 0;
 192   2              //_nop_();
 193   2              SCL = 1;
 194   2              uc8BitRecev <<= 1;
 195   2              uc8BitRecev |=SDA;
 196   2              _nop_();
 197   2              SCL = 0;
 198   2          }
 199   1          return uc8BitRecev;
 200   1      }
 201          
 202          /********************************************************************************
 203          * 函数名称: bit  WriteByte(unsigned char ucDataWrite, unsigned char uiAddWrite);
 204          * 功能描述: 写一个字节到指定地址
 205          * 输入参数: ucDataWrite:要写入的数据, uiAddWrite: 写入地址
 206          * 输出参数: 无
 207          * 返 回 值: 位变量.写入成功返回0
 208          * 其他说明:
 209          * 修改日期      版 本 号        修 改 人        修改内容
 210          *-------------------------------------------------------------------------------
 211          *
 212          ********************************************************************************/
 213          bit  WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite)
 214          {
 215   1          
 216   1          g_ucTimer24C04Ack = WAIT_ACK_TIME;
 217   1          g_FlagWaiting24C04Ack = 0;
 218   1          do{
 219   2              if ((g_FlagWaiting24C04Ack) && (0 == g_ucTimer24C04Ack)) //10ms等待
 220   2              {
 221   3                  I2CStop();
 222   3                  return ERR_TIME_OV;
 223   3              }
 224   2              I2CStart();
 225   2              //判断地址范围,是否超出24C04范围,要选第一页还是第二页
 226   2              if (0 != (uiAddWrite >> 9))
 227   2              {
 228   3                  I2CStop();
 229   3                  return ERR_ILLEGAL_ADD;
 230   3              }
 231   2              else if (0 != (uiAddWrite >> 8))
 232   2              {
 233   3                  Send8Bit(ADD_WRITE_24C04 | 0x02);
 234   3              }
 235   2              else
 236   2              {
 237   3                  Send8Bit(ADD_WRITE_24C04);
 238   3              }
 239   2              g_FlagWaiting24C04Ack = 1;
 240   2          }while (ReadAck());     //判断24C04是否忙
 241   1      
C51 COMPILER V8.02   24C04                                                                 05/18/2008 16:43:11 PAGE 5   

 242   1          Send8Bit(uiAddWrite);
 243   1          ReadAck();
 244   1          Send8Bit(ucDataWrite);
 245   1          ReadAck();
 246   1          I2CStop();
 247   1          if (ucDataWrite != ReadByte(uiAddWrite))
 248   1          {
 249   2              return ERR_WRT_WRONG_RESULT;
 250   2          }
 251   1          return WR_SUCC_RTN;
 252   1      }
 253          
 254          /*******************************************************************************
 255          * 函数名称: unsigned char ReadByte(unsigned int uiAddRead);
 256          * 功能描述: 读取指定地址的一个字节数据
 257          * 输入参数: 要读取的字节地址
 258          * 输出参数: 无
 259          * 返 回 值: 读出的地址内容
 260          * 其他说明:
 261          * 修改日期      版 本 号        修 改 人        修改内容
 262          *-------------------------------------------------------------------------------
 263          *
 264          *******************************************************************************/
 265          unsigned char ReadByte(unsigned int idata uiAddRead)
 266          {
 267   1          unsigned char ucDataRead;
 268   1          g_ucTimer24C04Ack = WAIT_ACK_TIME;
 269   1          g_FlagWaiting24C04Ack = 0;
 270   1          do
 271   1          {
 272   2              I2CStart();
 273   2              if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
 274   2              {
 275   3                  I2CStop();
 276   3                  return ERR_TIME_OV;
 277   3              }
 278   2      
 279   2              //判断地址范围,是否超出24C04范围,要选第一页还是第二页
 280   2              if (0 != (uiAddRead >> 9))
 281   2              {
 282   3                  I2CStop();

⌨️ 快捷键说明

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