单片机课程设计 读串行e2prom. 具体要求:

2025-03-18 20:13:45
推荐回答(1个)
回答1:

扔段程序
define BUS_SPEED 4300000 // Hz
#define CONST (BUS_SPEED / 1000 /32 ) // 1000 ms 8 循环

void Wait1ms(void)
{
asm {
PSHX
PSHH
LDHX #CONST
loop:
AIX #-1 ;2 cycles
CPHX #0 ;3 cycles
BNE loop ;3 cycles
PULH
PULX
}
}
//等待n毫秒
void WaitNms(int n)
{
int i;
for(i=1;i<=n;i++) Wait1ms();
}

//EEPROM 24C256 NEW

typedef union
{
word EE_Address;
struct
{
byte addr_H;
byte addr_L;
}Addr_bytes;
}tAddr;

tAddr sAddr;

#define Address sAddr.EE_Address
#define Addr_H sAddr.Addr_bytes.addr_H
#define Addr_L sAddr.Addr_bytes.addr_L

//word Address;
uchar length;
uchar i;
uchar IIC_Res_flg;
uchar flag;
#define MAX_LENGTH 64
#define MAX_PAGE 64
#define IIC_OK 1
#define IIC_SLAVE 0xa0

extern uchar WR_Data[64];
extern uchar RD_Data[64];
extern uchar dummy;

void Init_IIC(void)
{
IICF=89; // frequency divider register: BUS=8Mhz => 400Khz
IICC1=0XC0; // enable IIC module with interrupt;

IICA=0; //salve address of this module
IICS=0X12; // clear the IBAL and IICIF flags

}

void IIC_read_block(word addr,byte len)
{
Address= addr;
length=len;
i=0; // for interrupt only;
IIC_Res_flg=0;// for interrupt only;

flag=10; // defines receive function in the interrupt service routine

if(length>MAX_LENGTH)length=MAX_LENGTH;
IICC1_TXAK=0; //RX/TX=1;MS/SL=1,TXAK=0;
IICC1 |=0X30; // And generate START condition;
IICD=IIC_SLAVE; // Address the slave and set up for master transmit;

}

void IIC_write_block(word addr,byte len)
{
Address=addr; //load address;
length=len; // load length of data pack to be written;
i=0; // for interrupt only;
IIC_Res_flg=0; // for interrupt only;
flag=2; // define transmit function in the interrupt service routine;
if(length>MAX_PAGE) length=MAX_PAGE; // set limit;
IICC1_TXAK=0; // RX/TX=1;MS/SL=1;TXAK=0;
IICC1 |=0X30; // And generate START condition;
IICD=IIC_SLAVE; // Address the slave and set up for master transmit;

}