我按照手册的时序来写了2个读写函数。但是读写的数据总是不对。
我网上找了很多相关资料,感觉他们的操作时序跟我一样的呀。
我设置的是8位,CPOL=0,CPHA=0。
下面是操作的函数,望有人帮忙分析下。
/****************************************************************************
* 名 称:WriteIO()
* 功 能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address 地址
value 数据
* 出口参数:无
****************************************************************************/
void WriteIO(unsigned char Address, unsigned char value)
{
//选择寄存器页
RC531NSS_CLR();
SPI_SendByte(0x00);
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
//写入一个字节
RC531NSS_CLR();
SPI_SendByte((Address<<1)&0x7f);
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 称:ReadIO()
* 功 能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address 地址
* 出口参数:数据
****************************************************************************/
unsigned char ReadIO(unsigned char Address)
{
unsigned char a;
RC531NSS_CLR();
SPI_SendByte(0x00);
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte((Address<<1)|0x80);
RC531NSS_SET();
RC531NSS_CLR();
a = SPI_RecByte();
SPI_SendByte(0x00);
RC531NSS_SET();
return a;
}
/*******************************************************************
** 函数名称: void SPI_SendByte()
** 功能描述: 通过SPI接口发送一个字节
** 输 入: INT8U byte: 发送的字节
** 输 出: 无
**********************************************************************/
void SPI_SendByte(unsigned char byte)
{
LPC_SSP->DR=byte;
while(LPC_SSP->SR & SSPSR_TFE ==0); //为0 表示发送fifo 不为空
}
/**********************************************************************
** 函数名称: INT8U SPI_RecByte()
** 功能描述: 从SPI接口接收一个字节
** 输 入: 无
** 输 出: 收到的字节
*************************************************************************/
unsigned char SPI_RecByte(void)
{
uint8_t temp;
while(LPC_SSP->SR & SSPSR_RNE==0); //为0表示接受fifo为空
temp=LPC_SSP->DR;
return temp;
} |