lpc1343 spi 读写rc531时序问题

2019-03-25 20:45发布

我按照手册的时序来写了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;
}
    此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
daicheng
1楼-- · 2019-03-25 21:14
 精彩回答 2  元偷偷看……
443799600
2楼-- · 2019-03-25 22:30
能 说明下哪个地方出问题吗。谢谢
daicheng
3楼-- · 2019-03-26 02:51
在接收从机的数据时,主机也需要发送空闲字节来产生时钟
你试试这样
unsigned char SPI_RecByte(void)
{
   uint8_t temp;
  判断是否可以发送数据
  SPI_SendByte(0xFF);
   如果接收到数据
   temp=LPC_SSP->DR;
   return temp;
}
我没有板子,没有试过!你试试有问题在讨论一下

[ 本帖最后由 daicheng 于 2010-6-10 15:08 编辑 ]
443799600
4楼-- · 2019-03-26 03:34
在接收从机的数据时,主机也需要发送空闲字节来产生时钟
--------------
我把ssel    由高拉低,不能触发 sck的时钟产生吗?

我用了你的这种方法,每次返回的数据都是0xff了。
daicheng
5楼-- · 2019-03-26 06:31
我没用过这个片子,所以对寄存器不太熟悉
说过程吧
  判断是否可以发送数据
  发送一个0XFF
  是否有数据接收
  接收数据
443799600
6楼-- · 2019-03-26 12:02
悲剧,我整来整去,读写都不正确。这里又没有示波器。根本没法测试。我囧啊

一周热门 更多>