|
网上买的8a8k64s4a12,和ds3231的模块,上面还有一个24c32,P14接的SDA,P15接SCL,VCC和GND都是在U8W连过来的,我想读写24c32成功了再学3231,可是读出来都是0xff,我知道看别人的原代码很乱,但有人能指点一下吗?
#include <STC8.h>
#include <stdio.h>
#include <intrins.h>
unsigned char flag,Dat24c32H,Dat24c32L;
bit busy;
sbit SDA=P1^4;
sbit SCL=P1^5;
void UartInit(void) //9600bps@24.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xE8; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
EA=1; //打开总中断
}
void delayxms(unsigned int xms) //延时
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=1350;j>0;j--);
}
void I2C_Isr() interrupt 24
{
_push_(P_SW2);
P_SW2|=0x80;
if (I2CMSST&0x40)
{
I2CMSST&=~0x40; //清中断标志
busy = 0;
}
_pop_(P_SW2);
}
void Start()
{
busy=1;
I2CMSCR=0x81; //发送START命令
while(busy);
}
void SendData(char dat)
{
I2CTXD=dat; //写数据到数据缓冲区
busy=1;
I2CMSCR=0x82; //发送SEND命令
while(busy);
}
void RecvACK()
{
busy=1;
I2CMSCR=0x83; //发送读ACK命令
while(busy);
}
char RecvData()
{
busy=1;
I2CMSCR=0x84; //发送RECV命令
while(busy);
return I2CRXD;
}
void SendACK()
{
I2CMSST=0x00; //设置ACK信号
busy = 1;
I2CMSCR=0x85; //发送ACK命令
while(busy);
}
void SendNAK()
{
I2CMSST=0x01; //设置NAK信号
busy=1;
I2CMSCR=0x85; //发送ACK命令
while(busy);
}
void Stop()
{
busy=1;
I2CMSCR=0x86; //发送STOP命令
while(busy);
}
void Delay()
{
int i;
for (i=0; i<3000; i++)
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
}
void main()
{
P_SW2 = 0x80;
UartInit();
I2CCFG = 0xe0; //使能I2C主机模式
I2CMSST = 0x00;
Start(); //发送起始命令
SendData(0xa0); //发送设备地址+写命令
RecvACK();
SendData(0x00); //发送存储地址高字节
RecvACK();
SendData(0x01); //发送存储地址低字节
RecvACK();
SendData(0x12); //写测试数据1
RecvACK();
SendData(0x78); //写测试数据2
RecvACK();
Stop(); //发送停止命令
Delay(); //等待设备写数据
Start(); //发送起始命令
SendData(0xa0); //发送设备地址+写命令
RecvACK();
SendData(0x00); //发送存储地址高字节
RecvACK();
SendData(0x01); //发送存储地址低字节
RecvACK();
Start(); //发送起始命令
SendData(0xa1); //发送设备地址+读命令
RecvACK();
Dat24c32H=RecvData(); //读取数据1
SendACK();
Dat24c32L=RecvData(); //读取数据2
SendNAK();
Stop(); //发送停止命令
P_SW2 = 0x00;
while (1)
{
TI=1;
printf("READ Dat24C32H=%bx Dat24C32L=%bx \n",Dat24c32H,Dat24c32L);
while(!TI);
delayxms(2000);
}
}
|
|