dsp2812驱动HWD24C256代码,测试通过。

这个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_ */

分享代码就分享全,且不需要下载。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值