This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: 使用SPI读写EEPROM芯片AT25640B,EEPROM芯片一直输出高电平。

Part Number: TMS320F28335

您好,

自制板上使用的dsp为f28335,使用的eeprom为at25650b。现在想利用eeprom存储数据,然后现在测试dsp往eeprom读写数,或者读取AT25640B状态寄存器,AT25640B的SPi输出一直是高电平,且波形很奇怪。我的SPI的配置是这样的。

/*
 * SPI_EEP.c
 *
 *  Created on: 2021年10月16日
 *      Author: 
 */
#include "SPI_EEP.h"
void InitSpiGpio()
{

   InitSpiaGpio();
}

void InitSpiaGpio()
{
	   EALLOW;

	    GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;   // Enable pull-up on GPIO54 (SPISIMOA)
	    GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;   // Enable pull-up on GPIO55 (SPISOMIA)
	    GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;   // Enable pull-up on GPIO56 (SPICLKA)
//	    GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;   // Enable pull-up on GPIO57 (SPISTEA)
	    GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO16 (SPISIMOA)
	    GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO17 (SPISOMIA)
	    GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO18 (SPICLKA)
	    GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO19 (SPISTEA)

	    GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOA
	    GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIA
	    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA
//	    GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA

		GpioCtrlRegs.GPBMUX2.bit.GPIO57=0;
		GpioDataRegs.GPBSET.bit.GPIO57=1;
		GpioCtrlRegs.GPBPUD.bit.GPIO57=0;
		GpioCtrlRegs.GPBDIR.bit.GPIO57=1;

    EDIS;
}
void SPIA_Init(void)
{
	InitSpiaGpio();
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A
	EDIS;
	SpiaRegs.SPICCR.bit.SPISWRESET = 0; // Reset SPI
	SpiaRegs.SPICCR.all =0x0007;	             // 数据不复位,上升沿输出、下降沿输入、保留位0、禁用回还模式、传输位数8位。
	SpiaRegs.SPICTL.all =0x0006;    		     // 使能主机模式,正常相位,使能主机发送,禁止接收,溢出中断,禁止SPI中断,正常模式;

	SpiaRegs.SPIBRR=0x0063;    //SPI波特率=375000
//	SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
//	SpiaRegs.SPICTL.bit.CLK_PHASE=1;
	SpiaRegs.SPICCR.all =0x0087;		         // Relinquish SPI from Reset
	SpiaRegs.SPIPRI.bit.FREE = 0x0001;                // Set so breakpoints don't disturb xmission
	SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Reset SPI
}

//uint8_t SPIA_SendReciveData(uint8_t dat)
//{
//	// Transmit data
//	SpiaRegs.SPITXBUF=dat;
//
//	// Wait until data is received
////	while(SpiaRegs.SPIFFRX.bit.RXFFST !=1);
//	while(SpiaRegs.SPISTS.bit.INT_FLAG !=1);
//	return SpiaRegs.SPIRXBUF;
//}
uint8_t SPIA_SendReciveData(uint8_t dat)
{
	u8 retry=0;
	while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)   //等待发送区空  发送缓冲区空时  SR的bit1 为1  不空的时为0 与后的结果为0,继续等待
	{
	retry++;
	if(retry>200)return 0;
	}
	SpiaRegs.SPITXBUF=(dat|0x8000)<<8 ;  //发送一个byte
	retry=0;
	while(SpiaRegs.SPISTS.bit.INT_FLAG != 1)
	{
	retry++;
	if(retry>200)return 0;
	}
	return ((SpiaRegs.SPIRXBUF)&0x00ff);          //返回收到的数据

	}



/*
 * @name:eeprom_read_write_byte
 * @function:读取数据
 * @Author:
 */
u8 stsss=2;
//u8 eeprom_read_write_byte(u8 TxData)
//{
//	SpiaRegs.SPITXBUF=TxData;
//
//	// Wait until data is received
////	while(SpiaRegs.SPIFFRX.bit.RXFFST !=1);
//	while(SpiaRegs.SPISTS.bit.INT_FLAG==0){};
////    Delay_US(8);
//	DELAY_US(15);
//	stsss=SpiaRegs.SPISTS.bit.INT_FLAG ;
//	return SpiaRegs.SPIRXBUF;
//}
u16 eeprom_read_write_byte(u16 dat)
{
	u8 retry=0;
	while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)   //等待发送区空  发送缓冲区空时  SR的bit1 为1  不空的时为0 与后的结果为0,继续等待
	{
	retry++;
	if(retry>200)return 0;
	}
	SpiaRegs.SPITXBUF=(dat|0x8000)<<8 ;  //发送一个byte
	retry=0;
	while(SpiaRegs.SPISTS.bit.INT_FLAG != 1)
	{
	retry++;
	if(retry>200)return 0;
	}
	return ((SpiaRegs.SPIRXBUF)&0x00ff);          //返回收到的数据
}
/*
 * @name:eeprom_read_sr
 * @function:读取AT25640状态寄存器
 * @Author:
 */
u8 temppp=0;
u8 eeprom_read_sr(void)
{
	u8 dat;
	eeprom_ncs;

	eeprom_read_write_byte(RDSR);
//	DELAY_US(15);
	dat = eeprom_read_write_byte(0x00);
	eeprom_cs;
	temppp=dat;
	return  dat;
}

/*
 * @name:eeprom_write_byte
 * @function:写入一个数据
 * @Author:
 */
u8 ddd=0;
void eeprom_write_byte(u16 addr,u8 Dat)//没有问题
{
	unsigned char Add;
//	ddd=eeprom_read_sr()&RDY;
//	while(eeprom_read_sr()&RDY);//等待就绪信号
//	while(0);//等待就绪信号
	eeprom_ncs;//片选
	eeprom_read_write_byte(WREN);//启用数据写入状态
	eeprom_cs;

	eeprom_ncs;

	if(addr>0x00ff)
		eeprom_read_write_byte((WRITE|0x08));
	else
		eeprom_read_write_byte(WRITE);


	Add = (unsigned char)(addr & 0x00);
	eeprom_read_write_byte(Add);


	eeprom_read_write_byte(Dat);
	eeprom_cs;
}
/*
 * @name:eeprom_read_byte
 * @function:读取一个字节
 * @Author:
 */
u8 eeprom_read_byte(u16 addr)//没有问题
{
	u8 dat,add;
//	while(eeprom_read_sr()&RDY);
//	while(0);//等待就绪信号
	eeprom_ncs;

	if(addr>0x00ff)
		eeprom_read_write_byte((READ | 0x08));
	else
		eeprom_read_write_byte(READ);


	add = (unsigned char)(addr & 0x00);
	eeprom_read_write_byte(add);


	dat=eeprom_read_write_byte(0x00);
	eeprom_cs;
	return dat;
}
/*
 * @name:eeprom_read_write_byte
 * @function:连续写入数据
 * @Author:
 */
void eeprom_write_buf(u16 startAddr,u8 *buf,u16 count)
{
	u16 i;
	while(eeprom_read_sr()&RDY);

	eeprom_ncs;
	eeprom_read_write_byte(WREN);
	eeprom_cs;
	eeprom_ncs;

	eeprom_read_write_byte(WRITE);
	eeprom_read_write_byte(startAddr>>8);
	eeprom_read_write_byte(startAddr);

	for(i=0;i<count;i++)
	{
		eeprom_read_write_byte(*buf++);
	}
	eeprom_cs;
}
/*
 * @name:eeprom_write_nbyte
 * @function:连续写入n字节数据
 * @Author:
 */
void eeprom_write_nbyte(u16 startAddr,u8 *buf,u16 count)
{
	u16 pageTotal=count/64;
	u16 pageResidue=count%64;
	u16 i;
	u16 pageCnt=0;

	for(i=0;i<pageTotal;i++)
	{
		eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],64);
		pageCnt+=64;
	}
	eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],pageResidue);
}


/*
 * @name:eeprom_read_buf
 * @function:连续读取数据
 * @Author:
 */
void eeprom_read_buf(u16 startAddr,u8 *buf,u16 count)
{
	unsigned int i;
	while(eeprom_read_sr()&RDY);
	eeprom_ncs;

	eeprom_read_write_byte(READ);

	eeprom_read_write_byte(startAddr>>8);
	eeprom_read_write_byte(startAddr);


	for(i=0;i<count;i++)
	{
		*buf++ = eeprom_read_write_byte(0x00);
	}
	eeprom_cs;
}