打印
[微控制器/MCU]

lpc1343 spi 读写rc531时序问题

[复制链接]
3501|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金鱼木鱼|  楼主 | 2010-6-27 13:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照手册的时序来写了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;
}

相关帖子

沙发
想实习去| | 2010-6-27 13:19 | 只看该作者
接收时序有问题,你可以用示波器看一下!
最好看一下原例程!

使用特权

评论回复
板凳
北京户口| | 2010-6-27 13:50 | 只看该作者
在接收从机的数据时,主机也需要发送空闲字节来产生时钟
你试试这样
unsigned char SPI_RecByte(void)
{
uint8_t temp;
判断是否可以发送数据
SPI_SendByte(0xFF);
如果接收到数据
temp=LPC_SSP->DR;
return temp;
}
我没有板子,没有试过!你试试有问题在讨论一下

使用特权

评论回复
地板
金鱼木鱼|  楼主 | 2010-6-27 13:51 | 只看该作者
在接收从机的数据时,主机也需要发送空闲字节来产生时钟
--------------
我把ssel 由高拉低,不能触发 sck的时钟产生吗?

我用了你的这种方法,每次返回的数据都是0xff了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

346

主题

1551

帖子

2

粉丝