SPI
SPI共用4种模式,通过控制CPOL(时钟极性)和CPHA(时钟相位)来控制,此处以W25Q128的时序图来利用IO口模拟SPI模式0与模式3通信过程中的时序。
- 模式0:SCL处于低电平,第一个边沿收发
- 模式1:SCL处于低电平,第二个边沿收发
- 模式2:SCL处于高电平,第一个边沿收发
- 模式3:SCL处于高电平,第二个边沿收发
SPI模式0
uint8_t W25Q128_SendByte(uint8_t byte)
{int i= 0;uint8_t data= 0;//1. SCK引脚输出低电平W25Q128_SCK(0);delay_us(5);//3.循环发送8次,每次发送一个bit遵循MSB高位先出for(i=0;i<8;i++){//1.判断待发送的字节的最高位if(byte & 0x80){W25Q128_MOSI(1);}else{W25Q128_MOSI(0);}byte <<= 1;delay_us(5);//2.SCK引脚输出高电平,此时第一个边沿出现W25Q128_SCK(1);delay_us(5);//3.此时从机会响应一个bit,主机需要接收!data <<= 1;data |= W25Q128_MISO;delay_us(5);//4.SCK引脚输出低电平,此时第二个边沿出现W25Q128_SCK(0);delay_us(5);}return data;
}
SPI模式3
uint8_t W25Q128_SendByte(uint8_t byte) {int i = 0;uint8_t data = 0;//1. SCK引脚输出高电平W25Q128_SCK(1);delay_us(5);//3.循环发送8次, 每次发送一个bit遵循MSB高位先出for (i = 0; i < 8; i++) {//2.SCK引脚输出低电平,此时第一个边沿出现W25Q128_SCK(0);delay_us(5);//4.判断待发送的字节的最高位if (byte & 0x80) {W25Q128_MOSI(1);} else {W25Q128_MOSI(0);}byte <<= 1;delay_us(5);//5.SCK引脚输出高电平,此时第二个边沿出现W25Q128_SCK(1);delay_us(5);//6.此时从机会响应一个bit,主机需要接收!data <<= 1;data |= W25Q128_MISO;delay_us(5);}return data;
}