这个24C256是256KB空间的最大地址为0x7FFF,所以在读和写的时候要注意,找的例程中需要修改一下发送地址时候要分高八位和低八位发送,测试通过的程序c和h打包上传。
//.c如下
//24C256 E2PROM function
//pin description:GPIOB9---SCL,GPIOB10---SDA
//
//
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
//#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "24C256.h"
void ee_delay_loop(Uint32 delay)
{
Uint32 i;
for (i = 0; i < delay; i++)
{
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
}
}
void ee_init(void)
{
I2C_SCL_H;
ee_delay_loop(5);
I2C_SDA_H;
ee_delay_loop(5);
}
void I2CStart(void)
{
I2C_SDA_H;
ee_delay_loop(10);
I2C_SCL_H;
ee_delay_loop(20);
I2C_SDA_L;
ee_delay_loop(10);
I2C_SCL_L;
ee_delay_loop(20);
}
void I2CStop(void)
{
I2C_SDA_L;
ee_delay_loop(10);
I2C_SCL_H;
ee_delay_loop(20);
I2C_SDA_H;
ee_delay_loop(10);
I2C_SCL_L;
ee_delay_loop(20);
}
void i2c_sda_in(void)
{
EALLOW;
I2C_SDA_INPUT; //SDA设置为输入口
EDIS;
}
void i2c_sda_out(void)
{
EALLOW;
I2C_SDA_OUT; //SDA 设置为输出口
EDIS;
}
//I2C noack
void I2CNoAck(void)
{
I2C_SCL_H; //SCL=0
ee_delay_loop(10);
I2C_SDA_H; //SDA=1
ee_delay_loop(10);
I2C_SCL_H; //SCL=1
ee_delay_loop(20);
I2C_SCL_L; //SCL=0
ee_delay_loop(20);
I2C_SDA_L; //SDA=0
}
//I2C recack
int I2CRECACK(void)
{
int errTimer;
i2c_sda_in();
I2C_SDA_H;
ee_delay_loop(10);
I2C_SCL_H;
ee_delay_loop(10);
//read SDA
while(IICSDA){
errTimer++;
if(errTimer>250)
{
I2CStop();
return 1;
}
}
I2C_SCL_L;
ee_delay_loop(10);
i2c_sda_out();
return(0);
}
//I2CSend byte
void I2CSendByte(int data)
{
int flag,sz;
ee_delay_loop(10);
for(flag=0x0080;flag!=0;flag=flag/2)
{
I2C_SCL_L;
ee_delay_loop(10);
sz=data&flag;//按位发送数据
if(sz==0)
{I2C_SDA_L;}
else
{I2C_SDA_H;}
ee_delay_loop(10);
I2C_SCL_H; //SCL=1
ee_delay_loop(10);
ee_delay_loop(10);
}
I2C_SCL_L; //SCL=0
}
//I2C recbyte
int I2CRecByte(void)
{
int R_DATA=0;
int flag;
int sz;
i2c_sda_in();
ee_delay_loop(10);
for(flag=0x0080;flag!=0x00;flag=flag/2)
{
I2C_SCL_L;
ee_delay_loop(20);
I2C_SCL_H;
R_DATA=R_DATA<<1;
sz=IICSDA;//按位读取数据
if(sz==0)
{R_DATA=R_DATA&0xFFFE;} //SDA=0
else
{R_DATA=R_DATA|0x0001;} //SDA=1
ee_delay_loop(10);
}
i2c_sda_out();
return(R_DATA);
}
// I2C byte write to E2PROM
int BYTE_WR(int BYTE_BADDR,int BYTE_ADDR,int T_DATA)
{
int i,buff;
I2CStart(); //START();
buff=0xA0+BYTE_BADDR*2;
I2CSendByte(buff); //sent ROM page
i=I2CRECACK();
if(i==0)
{
I2CSendByte( (BYTE_ADDR>>8)&0xff );// sent data addr high
i=I2CRECACK();
if(i==0)
{
I2CSendByte( BYTE_ADDR&0xff );// sent data addr low
i=I2CRECACK();
if(i==0)
{
I2CSendByte(T_DATA);//sent data
i=I2CRECACK();
}
}
}
I2CStop();
ee_delay_loop(10);
return(i);
}
// I2C byte read from E2PROM
int BYTE_RD(int BYTE_BADDR,int BYTE_ADDR)
{
int i,buff;
I2CStart();
buff=0xA0+BYTE_BADDR*2;
I2CSendByte(buff); //sent data page
i=I2CRECACK();
if(i==0)
{
I2CSendByte((BYTE_ADDR>>8)&0xff);// sent data addr high
i=I2CRECACK();
if(i==0)
{
I2CSendByte( BYTE_ADDR&0xff );// sent data addr low
i=I2CRECACK();
if(i==0)
{
I2CStart();
buff=0xA1+BYTE_BADDR*2;
I2CSendByte(buff);
i=I2CRECACK();
if(i==0)
{buff=I2CRecByte();}
else
{ ;}
}
}
}
I2CNoAck();
I2CStop();
if(i==0)
{return(buff);}
else
{return(0);} // 返回0X0FFFF
}
/*
test:
void main(void)
{
ee_init();
FEED_WATCHDOG;
ee_delay_loop(20);
BYTE_WR(0,0x7000,0x07);//往A0+0地址的eeprom 的 0x7000地址 写入数据0x07
FEED_WATCHDOG;
ee_delay_loop(20);
databuffer[0]=BYTE_RD(0,0x7000); //读A0+0地址的eeprom 的 0x7000地址的数据
FEED_WATCHDOG;
}
*/
//.h
/*
* 24C256.h
* HWD
* Created on: 2024年7月16日
* Author:
* Version: V1.0
*/
#ifndef _24C256_H_
#define _24C256_H_
/* INCLUDE BEGIN */
/* INCLUDE END */
//
// Defines
#define I2C_SCL_H GpioDataRegs.GPBSET.bit.GPIOB9 = 1
#define I2C_SCL_L GpioDataRegs.GPBCLEAR.bit.GPIOB9 = 1
#define IICSDA GpioDataRegs.GPBDAT.bit.GPIOB10
#define I2C_SDA_H GpioDataRegs.GPBSET.bit.GPIOB10 = 1
#define I2C_SDA_L GpioDataRegs.GPBCLEAR.bit.GPIOB10 = 1
#define I2C_SDA_INPUT GpioMuxRegs.GPBDIR.bit.GPIOB10=0
#define I2C_SDA_OUT GpioMuxRegs.GPBDIR.bit.GPIOB10=1
//
void I2CStart(void);
void I2CStop(void);
void I2CNoAck(void);
int I2CRECACK(void);
void I2CSendByte(int data);
int I2CRecByte(void);
int BYTE_WR(int BYTE_BADDR,int BYTE_ADDR,int T_DATA);
int BYTE_RD(int BYTE_BADDR,int BYTE_ADDR);
void ee_delay_loop(Uint32 delay);
void ee_init(void);
#endif /* _24C256_H_ */
分享代码就分享全,且不需要下载。