打印

菜鸟关于NRF24L01的SPI几个问题

[复制链接]
1870|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SPI有四种工作方式方式


我看NRF24L01的时序图是

从这个时序图看无论输入还是输出都是上升沿有效,这不属于任何四个工作方式,还有标记的A部分有输出,B部分为什么没有输出呢?

相关帖子

沙发
tianxj01| | 2018-7-28 10:04 | 只看该作者
这里再复习一下SPI模式定义  其中一个是定义SPI CLK极性:空闲高电平或者空闲低电平
另一个位定义的是:SPI CLK的第一个或者第2个边沿采样数据。
所以,为什么不是4种里面的呢?
根据你贴的NR24L01时序图,空闲时间SCK低电平, 在SCK第一个时钟边沿输出有效数据,是一般单片机SPI定义最广的模式0。
至于涂黑的部分,不是表示说没有波形,而是说数据无效或者叫无效数据,像SPI读操作,单片机的MOSI 发生上面8位数据后,剩下的,就是目标芯片发送有效数据给MISO了,而上面的MOSI,这时候通常我们会发送一个虚拟数据(必须定义为芯片指令不存在的某个数),目的只是为了继续驱动SCK输出时钟,让从芯片把读回来数据放到MISO上面,这时候,MOSI上面其实是有数据的,但是这数据是无效的。

使用特权

评论回复
板凳
tianxj01| | 2018-7-28 10:17 | 只看该作者
tianxj01 发表于 2018-7-28 10:04
这里再复习一下SPI模式定义  其中一个是定义SPI CLK极性:空闲高电平或者空闲低电平
另一个位定义的是:SPI ...

补充一下,这点,也真是初学SPI者进行困惑或者搞不清楚的地方。
我看过不少软硬件的SPI基本驱动,很多都是把读和写弄成2个不同基本驱动,其实这样做也许能够正常工作,但正确的做法是:其实我们对SPI驱动,最底层的,我们只需要一个就是发送8位数据并回读8位数据,就像这样:
unsigned char SPI__RW_Byte(unsigned char Data)
{
                unsigned char Out = 0;
                unsigned char i;// = 0;
                for(i = 8; i > 0; i--)
                        {
                                SPI_CLK = 0;
                                SPI_MOSI=Data>>7;
                                Data <<= 1;
                                NOP();
                                NOP();
                                NOP();
                                NOP();
                                NOP();
                                Out<<=1;
                                SPI_CLK = 1;
                                Out|=SPI_MISO;
                        }
                SPI_CLK = 0;
                return Out;
        }
这样的底层驱动,就可以完全正确的用在SPI命令  SPI读  SPI写等各种扩展函数上面。
当我们需要SPI命令时候,我们只需要:
SPI__RW_Byte(Command);//就可以了
而需要SPI读,那么就变成下面这样:
void SPI_Flash_Read ( u32 ReadAddr , u8* pBuffer , u16 NumByteToRead )
        {
                u16 i;
                SPI_CS = 0;/* Enable chip select */
                SPI_RW_Byte(XX_ReadData);
                SPI_RW_Byte(ReadAddr);
                for(i=0;i<NumByteToRead;i++)
                        {
                                pBuffer =SPI_RW_Byte(Dummy); //发送虚拟数据,驱动CLK读一个字节
                        }
                SPI_CS = 1;/* Disable chip select */
        }

使用特权

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

本版积分规则

31

主题

96

帖子

2

粉丝