关于SPI读W25Q128

2019-07-21 01:47发布

本帖最后由 kissmyass 于 2016-11-15 20:45 编辑

看了原子哥的SPI例程,想用模拟SPI的方式驱动W25Q128,发现了几个问题1:例程中的CS片选也是由stm32自动控制的吗?
2:启动传输时发送0xff为啥不用拉低片选?
3:原子哥的例程中使用的是模式3(SCK空闲时为高),想用w25q128的模式0(SCK空闲时为低),对照了MDK的逻辑分析仪感觉时序没问题啊,用为啥不行?还是我的程序问题?求解求解


贴上我的部分程序
#define CS PBout(12)
#define SCK PBout(13)
#define MISO PBin(14)
#define MOSI PBout(15)


void SPI2_Init(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
         

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PB13/14/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //PB13/14/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        SCK=0;
        delay_us(5);
        CS=0;
        delay_us(5);
        SPI2_ReadWriteByte(0xFF);//启动传输                 
delay_us(5);
        CS=1;

}


u8 SPI2_ReadWriteByte(u8 TxData)
{
        u8 rec=0,i;
        for(i=0;i<=7;i++)
        {               
                if(TxData&0X80)MOSI=1;
                else MOSI=0;
                TxData<<=1;
                delay_us(2);
                SCK=1;
                delay_us(2);
                SCK=0;
                delay_us(2);
                rec<<=1;
                rec|=MISO;               
        }
        delay_us(5);
        return rec;
}

发送0xff:
0xff.png

发送0x90:
0x90.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。