为什么SPI读取24l01总是收到0x0e?
不管读哪位寄存器都是这样。。 我还没开始用,顶你一下 我用的是luminary的MCU,用到的是自带的SPI库函数,这是我的读写函数unsigned char spi_send_read_byte(unsigned char byte)
{
unsigned char ucVal;
unsigned long ulVal;
SSIDataPut(SSI0_BASE ,byte);//向SPI 发送FIFO写一个字节
SSIDataGet(SSI0_BASE ,&ulVal);//向SPI 接收FIFO读一个字节
ucVal = (unsigned char)ulVal;
return ucVal;
}
这是主函数中的调用片段:
SSIDataPut(SSI0_BASE ,(unsigned long)0x00);//读00寄存器的值
SSIDataGet(SSI0_BASE ,(unsigned long*)&ucStatus);//把数据读出到ucStatus中
write_hex_8(ucStatus);//将数据向串口打印 要不你不要使用fifo,或者你要等待一个字节发送完成了再读fifo,我的理解是,发送和接收是同时产生的,发多少clock,就收多少clock
你还有一个cs 片选呢? 不知道楼主SSIDataPut(SSI0_BASE ,byte);//SSIDataGet(SSI0_BASE ,&ulVal);函数是如何定义的
估计是楼主的SPI driver有问题 回复【3楼】VERY VERY低调
-----------------------------------------------------------------------
那个luminary MCU SPI的FIFO好像关不掉。。CS片选SPI自带了,用示波器看有信号,而且我试过直接用IO口作片选。。
回复【4楼】maomao2126
-----------------------------------------------------------------------
void
SSIDataGet(unsigned long ulBase, unsigned long *pulData)
{
//
// Check the arguments.
//
ASSERT((ulBase == SSI0_BASE) || (ulBase == SSI1_BASE));
//
// Wait until there is data to be read.
//
while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE))
{
}
//
// Read data from SSI.
//
*pulData = HWREG(ulBase + SSI_O_DR);
}
void
SSIDataPut(unsigned long ulBase, unsigned long ulData)
{
//
// Check the arguments.
//
ASSERT((ulBase == SSI0_BASE) || (ulBase == SSI1_BASE));
ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) &
SSI_CR0_DSS_M))) == 0);
//
// Wait until there is space.
//
while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF))
{
}
//
// Write the data to the SSI.
//
HWREG(ulBase + SSI_O_DR) = ulData;
} 我又重新写了一下send read,还是不对,我快崩溃了。。。
unsigned char spi_send_read_byte(unsigned char byte)
{
unsigned long ulBase = SSI0_BASE;
//
// Wait until there is space.
//
while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF))
{
}
//
// Write the data to the SSI.
//
HWREG(ulBase + SSI_O_DR) = byte;
//
// Wait until there is data to be read.
//
while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE))
{
}
//
// Read data from SSI.
//
return HWREG(ulBase + SSI_O_DR);
} 自己控制cs的么? 回复【7楼】VERY VERY低调
-----------------------------------------------------------------------
我用示波器看了cs线上有信号,而且我把cs线拔了后就没反应了。 MCU和无线模块都换过了,一样的问题。。。我快崩溃了。。难道要我用模拟时序。。 昨晚,我用stm32 的spi 读24l01,读写正常
cs 最好自己来控制吧,而且并不是一个字节就把cs线拉高,要等待传输完成了才cs = 1的
spi极性的设置你对了没
cpol = 0
还有另外的一个也是0 回复【10楼】VERY VERY低调
-----------------------------------------------------------------------
谢谢,就是这个问题,要等传输完成才置位CSN。。。 收藏下~~
页:
[1]