本帖最后由 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:
发送0x90:
一周热门 更多>