SPI的双线单向模式(SPI_Direction_2Lines_RxOnly)!!!求助

2019-08-08 11:46发布

我使用的flash芯片是W25q64,单片机是f103

RT,有人用过这个模式(SPI_Direction_2Lines_RxOnly)吗?这个功能能让我们使用双线接收收据,速度可以提升一倍。

我在网上查阅了很多资料,知道stm32在这个模式下SPI CLK应该是在使能了SPI的情况下不停输出
知道禁能了SPI为止。所以,我利用接收中断接收数据并且禁能SPI以停止CLK的输出


、、、、、、、、、、但现在接收到的数据却如下:、、、、、、、、、、、、、、

0x00 0x11 0x00 0x11 0x22 0x33 0x22 0x33 0x00 0x11 0x00 0x11 0x22 0x33 0x22
0x33 0x44 0x55 0x44 0x55 0x66 0x77 0x66 0x77 0x44 0x55 0x44 0x55 0x66 0x77
0x66 0x77 0x00 0x11 0x00 0x11 0x22 0x33 0x22 0x33 0x00 0x11 0x00 0x11 0x22
0x33 0x22 0x33 0x44 0x55 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff


、、、、、、、、、、、、、、、、、程序如下:、、、、、、、、、、、、、、、、、、、

void FastReadDual(u32 addr,u8* pBuffer,u32 NumByteToRead)
{
          
           SPI_InitTypeDef  SPI_InitStructure;
           NVIC_InitTypeDef  NVIC_InitStruct;
       
          //初始化FLASH指令                                                                                      
          FLASH_CSL                                      //使能器件   
    SPI1_ReadWriteByte(W25X_FastReadDual);      //发送读取命令   
    SPI1_ReadWriteByte((u8)((addr)>>16));          //发送24bit地址   
    SPI1_ReadWriteByte((u8)((addr)>>8));   
    SPI1_ReadWriteByte((u8)addr);  
    SPI1_ReadWriteByte(0xff);                      //Read dummy
       
    //配置NVIC
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
               
                NVIC_InitStruct.NVIC_IRQChannel = SPI1_IRQn;
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

                NVIC_Init(&NVIC_InitStruct);
               
                //配置spi
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
                SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为低电平
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
                SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;                //定义波特率预分频的值:波特率预分频值为64
                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
                SPI_InitStructure.SPI_CRCPolynomial = 0;        //CRC值计算的多项式
                SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
         
          SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
         
                SPI_Cmd(SPI1, ENABLE); //使能SPI外设

                                          
       
}


void SPI1_IRQHandler(void)
{

        flashbuffer[i] = SPI1->DR;
        i++;
        if(i==100) {SPI_Cmd(SPI1, DISABLE);FLASH_CSH } //禁能SPI外设
       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
a3748622
1楼-- · 2019-08-08 17:23
漏掉了一点:
flash之前已经被我写入了数据,是从0x00到0x64,也就是0到100,写在地址0到地址99。

         for(i=0;i<100;i++) flashbuffer[i]=i;
       
         PageWrite(0,flashbuffer,100);
          
         FastReadDual(0 ,flashbuffer,100);
         
         for(i=0;i<100;i++)
         printf("0x%02x ",flashbuffer[i]);

一周热门 更多>