求助AT24C02
#include <STC8h.H>#include "main.h"
#include "OLED.h"
#include <intrins.h>
void I2C_Init()
{
P_SW2 |= 0x80;
I2CCFG = 0xe0; //使能I2C主机模式
I2CMSST = 0x00;
P1M0 = 0x30; P1M1 = 0x10; //P15设为推挽输出,P14设为开漏输出
P1PU = 0x10;//P14接上拉电阻
}
void Wait()
{
while (!(I2CMSST & 0x40));
I2CMSST &= ~0x40;
}
void Start()
{
I2CMSCR = 0x01; //发送START命令
Wait();
}
void SendData(char dat)
{
I2CTXD = dat; //写数据到数据缓冲区
I2CMSCR = 0x02; //发送SEND命令
Wait();
}
void RecvACK()
{
I2CMSCR = 0x03; //发送读ACK命令
Wait();
}
unsigned char RecvData()
{
I2CMSCR = 0x04; //发送RECV命令
Wait();
return I2CRXD;
}
void SendACK()
{
I2CMSST = 0x00; //设置ACK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void SendNAK()
{
I2CMSST = 0x01; //设置NAK信号
I2CMSCR = 0x05; //发送ACK命令
Wait();
}
void Stop()
{
I2CMSCR = 0x06; //发送STOP命令
Wait();
}
void WriteAT24C02(unsigned char device_addr,unsigned char register_addr,unsigned char dat)
{
Start();
SendData(device_addr);
RecvACK();
SendData(register_addr);
RecvACK();
SendData(dat);
RecvACK();
Stop();
}
unsigned char ReadAT24C02(unsigned char device_addr,unsigned char register_addr)
{
unsigned char temp;
Start();
SendData(device_addr);
RecvACK();
SendData(register_addr);
RecvACK();
Start();
SendData(device_addr|0x01);
temp = RecvData();
SendNAK();
Stop();
return temp;
}
void Delay100ms(void) //@24.000MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 13;
j = 45;
k = 214;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*
void WriteNbyte(u8 addr, u8 *p, u8 number)
{
Start(); //发送起始命令
SendData(SLAW); //发送设备地址+写命令
RecvACK();
SendData(addr); //发送存储地址
RecvACK();
do
{
SendData(*p++);
RecvACK();
}
while(--number);
Stop(); //发送停止命令
}
*/
/*
void ReadNbyte(u8 addr, u8 *p, u8 number)
{
Start(); //发送起始命令
SendData(SLAW); //发送设备地址+写命令
RecvACK();
SendData(addr); //发送存储地址
RecvACK();
Start(); //发送起始命令
SendData(SLAR); //发送设备地址+读命令
RecvACK();
do
{
*p = RecvData();
p++;
if(number != 1) SendACK(); //send ACK
}
while(--number);
SendNAK(); //send no ACK
Stop(); //发送停止命令
}
*/
void main(void)
{
unsigned char test_num = 90;
unsigned char dat;
OLED_Init();
WriteAT24C02(0xa0,0x00,0x0A);
Delay100ms();
dat = ReadAT24C02(0xa0,0x00);
dat = ReadAT24C02(0xa2,0x00);
dat = ReadAT24C02(0xa4,0x00);
dat = ReadAT24C02(0xa6,0x00);
Delay100ms();
OLED_ShowNum(1,1,dat,2);
OLED_ShowNum(2,1,dat,2);
OLED_ShowNum(3,1,dat,2);
OLED_ShowNum(4,1,dat,2);
OLED_ShowNum(1,4,test_num,2);
while(1)
{
}
}
我挂载了四个AT24c02,但是读写不正常,往里面写入的数据,读出来不一样,请教一下各位大佬是什么原因
你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧 王昱顺 发表于 2024-11-5 19:02
你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧
我是往一个芯片里写数据,但是读出来的数据和我写的不一样 OLED显示的啥内容?拍个照片看看 把另外三个拆了来试 WriteAT24C02怎么只有一次出现呢?似乎是给A0芯片写数据,其他三个呢 已解决,少了一个等待应答
页:
[1]