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

📄 at24c02.c

📁 一个采用C8051F020芯片实现的流量计控制系统源代码
💻 C
字号:
//参考程序A:AT24C02.C   SMBUS  24C02 读/写  2005.12.25

#include <c8051f020.h>                      // SFR declarations
#include <intrins.h>    
#include "AT24C02.h"
#include "GlobeDef.h"

INT8  data  SLAW;                           // 保存从地址+ WRITE 位
INT8  data  SLAR;                           // 保存从地址+ WRITE 位
INT8  data  WORD,WORDADR;                   // 保存被收/发的数据字节
INT8  data  nSendNums;                      // 保存被收/发的数据字节的数目        
INT8U data  SENDMODE;                       // SENDMODE作读/写控制字                       
bit SM_BUSY=0;                              // 忙碌标志位



void SLA_SEND(char nWordAddr, char nWord, char nNumber)
{
  SENDMODE = 0x01;
  nSendNums = nNumber + 1;
  while (SM_BUSY);                          // 若SMBUS忙碌就等待
  SM_BUSY = 1;                              // 置SM_BUSY位(忙碌标志位)为1                
  SLAW = SMB_ADDRESS | SMB_WRITE;           // COMMAND = 7 个地址位 + 一位WRITE.
  WORD = nWord;                             // WORD中存放要送到24C02中去的数据(8位)
  WORDADR = nWordAddr;                      // OP_CODE 中存放被传送数据送入24C02的首地址.
  STO = 0;
  STA = 1;                                  // 启动数据传输
  while (SM_BUSY);                          // 等待传输完成
}

char SLA_READ(char nWordAddr, char nNumber)
{
  nSendNums = nNumber;
  SENDMODE = 0x00;
  while (SM_BUSY);                          // 若SMBUS忙碌就等待
  SM_BUSY = 1;                              // 置SM_BUSY位(忙碌标志位)为1 
  SLAR = SMB_ADDRESS | SMB_READ;            // COMMAND = 7 个地址位 + 一位READ
  WORDADR = nWordAddr;                      // OP_CODE 中存放从24C02读出数据的的首地址.
  STO = 0;
  STA = 1;                                  // 启动传输
  while (SM_BUSY);                          // 等待传输完成 
  return WORD;                              // 返回读出来的数据(一个字节)
}

void SMBUS_ISR (void) interrupt INT_I2C     // 中断服务程序
{
  switch (SMB0STA)                          // 根据中断状态码跳转,SMB0STA 是中断状态寄存器
  {
    case SMB_START:	                        // 0x08, (MT & MR) 发送起始位
      SMB0DAT = SLAW ;                      // 装入被访问的从芯片的写地址
      STA = 0;                              // 人工清除 STA 位
      SI = 0;                               // 清除中断标志位
      break;
    case SMB_RP_START:	                    // 0x10,(MT & MR) 重复发送起始位
      SMB0DAT = SLAR;                       // 装入被访问的从芯片的读地址
      STA = 0;                              // 人工清除 STA 位
      SI = 0;                               // 清除中断标志位
      break;
    case SMB_MTADDACK:                      // 0x18 ,(MT) 发送从地址 + W 后收到ACK
      SMB0DAT = WORDADR;
      SI = 0;                               // 清除中断标志位
      break;
    case SMB_MTADDNACK:     	            // 0x20,(MT) 发送从地址 + W 后收到NACK
      STO = 1;
      STA = 1;
      SI = 0;                               // 清除中断标志位
      break;
    case SMB_MTDBACK:		                // 0x28,(MT) 发送数据后收到ACK
      switch (SENDMODE)                     // 检查低1位
      {
        case 1:
		  nSendNums--;
		  if (nSendNums)
			SMB0DAT = WORD;
		  else
          {
			STO = 1;
		    SM_BUSY = 0;
	      }
          break;             
        case 0:
		  STO = 0;
          STA = 1;
          break;            
        default:              
          STO = 1;
          SM_BUSY = 0;
          break;
      }
      SI = 0;
      break;
    case SMB_MTDBNACK:	                    // 0x30
      STO = 1;
      STA = 1;
      SI = 0;                               // 清除中断标志
      break;
    case SMB_MRADDACK:	                    // 0x40
      AA = 0;                        
      SI = 0;
      break;
   	case SMB_MRADDNACK:	                    // 0x48
      STO = 0;
      STA = 1;
      SI = 0;
      break;
    case SMB_MRDBNACK:	                    // 0x58
      WORD = SMB0DAT;
      STO = 1;
      SM_BUSY = 0;
      AA = 1;                          
      SI = 0;
      break;
    default:
      STO = 1;
      SM_BUSY = 0;
      break;
  }
}

⌨️ 快捷键说明

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