SPI裸机驱动学习笔记

CPOL和CPHA详解

CPOL 时钟极性

表示时钟CLK线空闲状态时高还是低

CPOL=0 空闲状态为低

CPOL=1 空闲状态为高

CPHA 时钟相位

表示第一个还是第二个边沿采集数据

CPHA=0 第一个边沿采集数据

CPHA=1 第二个边沿采集数据

SPI四种模式

我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行

以S3C2440 SPI控制器为例讲解四种模式

1、以OLED为案例分析SPI

数据手册的重点部分为:1、命令    2、时序

从时序图可以看出该器件可以选择模式0 和模式 3 上升沿采样,验证了以上观点

数据手册上的oled的时序如图:

模拟SPI参考代码:

static void OLEDWriteCmd(unsigned char cmd)
{
    OLED_Set_DC(0); /* 0 command 模式 1 数据模式*/
    OLED_Set_CS(0); /* select OLED 片选*/

    SPISendByte(cmd); //发送命令

    OLED_Set_CS(1); /* 取消片选 de-select OLED */
    OLED_Set_DC(1); /*恢复为数据模式*/
}

void SPISendByte(unsigned char val)
{
    int i;
    for (i = 0; i < 8; i++)
    {
        SPI_Set_CLK(0);
        SPI_Set_DO(val & 0x80); //高位在前
        SPI_Set_CLK(1);     //从低拉高 上升沿采样
        val <<= 1;
    }
    
}

2、以W25Q128 FLASH 为例分析SPI

重点关注:寄存器,命令,时序

以读ID为例:

/*读厂商ID*/
void ReadId()
{
	u8 idbuf[2];
	W25QXX_CS = 0; //选中
	SPI2_ReadWriteByte(0x90);//发送读ID命令
	SPI2_ReadWriteByte(0x00);
	SPI2_ReadWriteByte(0x00);
	SPI2_ReadWriteByte(0x00); //发送地址0x000000
	
	idbuf[0] = SPI2_ReadWriteByte(0xFF);
	idbuf[1] = SPI2_ReadWriteByte(0xFF); //读出id
	
	W25QXX_CS = 1; //取消片选
	
}
发布了137 篇原创文章 · 获赞 106 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/shenlong1356/article/details/103074908