📄 at24c02.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 + -