?? 24c02test.c
字號(hào):
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f000.h> // SFR declarations
#include <stdio.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void); //系統(tǒng)時(shí)鐘初始化
void SMBUS_ISR (void); //中斷服務(wù)程序
char SLA_READ(char chip,char wordadr,char number);
void SLA_SEND(char chip,char wordadr, char word,char number);
void UART0_Init (void);
void SYSCLK_Init (void);
void PORT_Init (void);
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define WRITE 0x00 // SMBUS尋址字節(jié)的寫(xiě)標(biāo)志位
#define READ 0x01 // SMBUS尋址字節(jié)的讀標(biāo)志位
// Device addresses
#define CHIP_A 0xA0 //AT24C02器件自身的尋址字節(jié)
#define CHIP_B 0x70 //AT24C02器件自身的尋址字節(jié)
#define SMB_BUS_ERROR 0x00 //總線錯(cuò)誤
//MT為主發(fā)送器,MR為主接收器
#define SMB_START 0x08 // (MT & MR) 發(fā)送起始位
#define SMB_RP_START 0x10 // (MT & MR) 重復(fù)起始位
#define SMB_MTADDACK 0x18 // (MT) 發(fā)送從地址 + W 后收到ACK
#define SMB_MTADDNACK 0x20 // (MT) 發(fā)送從地址 + W 后收到NACK
#define SMB_MTDBACK 0x28 // (MT) 發(fā)送數(shù)據(jù)后收到ACK
#define SMB_MTDBNACK 0x30 // (MT) 發(fā)送數(shù)據(jù)后收到NACK
#define SMB_MTARBLOST 0x38 // (MT)競(jìng)爭(zhēng)失敗
#define SMB_MRADDACK 0x40 // (MR) 發(fā)送從地址 + R 后收到 ACK
#define SMB_MRADDNACK 0x48 // (MR) 發(fā)送從地址 + R 后收到 NACK
#define SMB_MRDACK 0x50 // (MR) 收到數(shù)據(jù)字節(jié) 后已發(fā)送ACK
#define SMB_MRDBNACK 0x58 // (MR) 收到數(shù)據(jù)字節(jié) 后已發(fā)送NACK
#define SYSCLK 11059200 // SYSCLK frequency in Hz
#define BAUDRATE 115200 // Baud rate of UART in bps
char DATA[6]={0x17,0x3f,0x06,0x5b,0x4f};
char SLAW,DATA1[6]; // 保存從地址+ WRITE 位
char SLAR; // 保存從地址+ WRITE 位
char WORD; // 保存被收/發(fā)的數(shù)據(jù)字節(jié)
char xdata sendnumber; // 保存被收/發(fā)的數(shù)據(jù)字節(jié)的數(shù)目
unsigned char xdata WORDADR; //保存被傳送的數(shù)據(jù)在24C02中的首地址.
unsigned char xdata SENDMODE; //SENDMODE作讀/寫(xiě)控制字
unsigned char j,k,sla,n,p;
unsigned int i;
bit SM_BUSY; //忙碌標(biāo)志位
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
unsigned char check,Y,i=0; // 測(cè)試用的工作變量
WDTCN = 0xde; // 關(guān)閉看們狗
WDTCN = 0xad;
UART0_Init ();
SYSCLK_Init ();
PORT_Init ();
SMB0CN = 0x44; // 允許SMBUS, 應(yīng)答返回AA(低電平
SMB0CR = 0xf8; // SMBus 速率= 100 kHz,系統(tǒng)時(shí)鐘為11.0592MHZ
EIE1 |= 2; // SMBus 中斷使能
EA = 1; // 開(kāi)中斷
SM_BUSY = 0; // SM_BUSY是忙碌標(biāo)志位
SI = 0; //SM_BUSY中斷標(biāo)志位
sla=CHIP_A;
for (j=0;j<0x06;j++) //向24C02的000地址依次寫(xiě)入64個(gè)數(shù)據(jù),
{
Y=DATA[i]; //64個(gè)數(shù)據(jù)的數(shù)值從10H---4FH
SLA_SEND(sla, j,Y,0x01); // 寫(xiě)入AT24C02
i++;
}
for (j=0;j<0x06;j++) //從24C02的00地址依次連續(xù)讀出64個(gè)數(shù)據(jù),
{ //64個(gè)數(shù)據(jù)的數(shù)值應(yīng)該是從10H---3FH(連續(xù)存放)
check=SLA_READ(sla, j,0x01);
DATA1[j]=check; //讀出來(lái)的數(shù)據(jù)依次連續(xù)存入數(shù)組DATA[]中
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SLA_SEND
//-----------------------------------------------------------------------------
void SLA_SEND(char chip, char wordadr, char word,char number)
{
SENDMODE=0x01;
sendnumber=number+1;
while(SM_BUSY); // 若SMBUS忙碌就等待
SM_BUSY = 1; // 置SM_BUSY位(忙碌標(biāo)志位)為1
SLAW = (chip| WRITE); // COMMAND = 7 個(gè)地址位 + 一位WRITE.
WORD = word; // WORD中存放要送到24C02中去的數(shù)據(jù)(8位)
WORDADR = wordadr; // OP_CODE 中存放被傳送數(shù)據(jù)送入24C02的首地址.
STO = 0;
STA = 1; // 啟動(dòng)數(shù)據(jù)傳輸
while(SM_BUSY); // 等待傳輸完成
}
//-----------------------------------------------------------------------------
// SLA_READ
//-----------------------------------------------------------------------------
char SLA_READ(char chip, char wordadr,char number){
sendnumber=number;
SENDMODE=0;
while(SM_BUSY); // 若SMBUS忙碌就等待
SM_BUSY = 1; // 置SM_BUSY位(忙碌標(biāo)志位)為1
SLAR = (chip| READ); // COMMAND = 7 個(gè)地址位 + 一位READ
WORDADR = wordadr; // OP_CODE 中存放從24C02讀出數(shù)據(jù)的的首地址.
STO = 0;
STA = 1; // 啟動(dòng)傳輸
while(SM_BUSY); // 等待傳輸完成
return WORD; //返回讀出來(lái)的數(shù)據(jù)(一個(gè)字節(jié))
}
//-----------------------------------------------------------------------------
// SMBUS_ISR
//-----------------------------------------------------------------------------
void SMBUS_ISR (void) interrupt 7 //中斷服務(wù)程序
{
switch (SMB0STA){ // 根據(jù)中斷狀態(tài)碼跳轉(zhuǎn)
//(SMB0STA 是中斷狀態(tài)寄存器)
case SMB_START: //0x08, (MT & MR) 發(fā)送起始位
SMB0DAT = SLAW ; // 裝入被訪問(wèn)的從芯片的寫(xiě)地址
STA = 0; // 人工清除 STA 位
SI = 0; // 清除中斷標(biāo)志位
break;
case SMB_RP_START: //0x10,(MT & MR) 重復(fù)發(fā)送起始位
SMB0DAT = SLAR; // 裝入被訪問(wèn)的從芯片的讀地址
STA = 0; // 人工清除 STA 位
SI = 0; // 清除中斷標(biāo)志位
break;
case SMB_MTADDACK: //0x18 ,(MT) 發(fā)送從地址 + W 后收到ACK
SMB0DAT = WORDADR;
SI = 0; // 清除中斷標(biāo)志位
break;
case SMB_MTADDNACK: //0x20,(MT) 發(fā)送從地址 + W 后收到NACK
STO = 1;
STA = 1;
SI = 0; // 清除中斷標(biāo)志位
break;
case SMB_MTDBACK: //0x28,(MT) 發(fā)送數(shù)據(jù)后收到ACK
switch (SENDMODE){ // 檢查低1位
case 1:
sendnumber--;
if(sendnumber)
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; // 清除中斷標(biāo)志
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;
}
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x27; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x5c; // XBAR2: Initial Reset Value
PRT0CF = 0x14; // Output configuration for P0
PRT1CF = 0x10; // Output configuration for P3
PRT3CF = 0x01; // Output configuration for P3
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
// delaynms counter
OSCXCN = 0x67; // start external oscillator with
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON = 0x50; // SCON: mode 1, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD = 1
TI = 1; // Indicate TX ready
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -