Crystalline 发表于 2024-11-5 18:02:41

求助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:30

你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧

Crystalline 发表于 2024-11-5 19:13:36

王昱顺 发表于 2024-11-5 19:02
你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧

我是往一个芯片里写数据,但是读出来的数据和我写的不一样

21cnsound 发表于 2024-11-5 19:18:45

OLED显示的啥内容?拍个照片看看

邮箱 发表于 2024-11-5 20:27:26

把另外三个拆了来试

VCC 发表于 2024-11-5 20:54:58

WriteAT24C02怎么只有一次出现呢?似乎是给A0芯片写数据,其他三个呢

Crystalline 发表于 2024-11-6 10:45:05

已解决,少了一个等待应答
页: [1]
查看完整版本: 求助AT24C02