kehuadong

SPI的 CLK_POL和CLK_PHA

1.模式0(CPOL=0,CPHA=0)

模式0特性:

CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿

CPHA = 0:数据在第1个跳变沿(上升沿)采样

 

2.模式1(CPOL=0,CPHA=1)

模式1特性:

CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿

CPHA = 1:数据在第2个跳变沿(下降沿)采样

3.模式2(CPOL=1,CPHA=0)

CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿

CPHA = 0:数据在第1个跳变沿(下降沿)采样

 

4.模式3(CPOL=1,CPHA=1)

CPOL = 1:空闲时是高电平,第1个跳变沿是下降沿,第2个跳变沿是上升沿

CPHA = 1:数据在第2个跳变沿(上升沿)采样

PS: 每个周期的前半周期CLK=CPOL^CPHA

进入前半周期后马上写SDA

进入后半周期后,对方因为IO中断, 而读入我们前半周期所写SDA

 

1: CPOL=0, CPHA=0

 CS=0之前CLK=0,  每个bit前半周期CLK=CPOL^CPHA=0

// 写之前CLK是0, BIT前半周期, CLK是0, 进入前半周期马上写SDA
void SPI_WriteMode0_MSB(uint8_t ch) {
    for (uint8_t mask = 0x80; mask; mask >>= 1) {
        if (ch & mask) {
            SDA_H;
        } else {
            SDA_L;
        }
        
        SPI_Tick();
        SCL_H;        // 对方在这之后产生中断然后读入
        
        SPI_Tick();
        SCL_L;        // 最后回到CLK=0
    }
}

2. CPOL=0, CPHA=1

CS=0之前CLK=0, 每个bit前半周期CLK=CPOL^CPHA=1

// 写之前CLK是0, BIT前半周期, CLK是1, 所以片选后, 先CLK_H, 再马上写SDA
void SPI_WriteMode1_MSB(uint8_t ch) {
    for (uint8_t mask = 0x80; mask; mask >>= 1) {
        CLK_H;
        if (ch & mask) {
            SDA_H;
        } else {
            SDA_L;
        }
        SPI_Tick();
        
        SCL_L;    // 最后回到CLK=0, 对方在这之后产生中断,然后读入
        SPI_Tick();
    }
}

 

3. CPOL=1, CPHA=0

CS=0之前CLK=1, 每个bit前半周期CLK=CPOL^CPHA=1

// 写之前CLK是1, BIT前半周期, CLK是1, 所以片选CS=0后, 马上写SDA
void SPI_WriteMode2_MSB(uint8_t ch) {
    for (uint8_t mask = 0x80; mask; mask >> = 1) {
        if (ch & mask) {
            SDA_H;
        } else {
            SDA_L;
        }
        
        SPI_Tick();
        
        SCL_L;        // 对方在这之后产生中断,然后读入
        
        SPI_Tick();
        SCL_H;        // 最后回到CLK=1        
    }
}

 

4. CPOL=1, CPHA=1

CS=0之前, CLK=1, 每个bit前半周期CLK=CPOL^CPHA=0, 

// 写之前CLK是1, BIT的前半周期CLK是0, 所以片选之后, 先CLK_L; 然后马上写SDA
void SPI_WriteMode3_MSB(uint8_t ch) {
    for (uint8_t mask = 0x80; mask; mask >>= 1) {
        CLK_L;
        if (ch & mask) {
            SDA_H;
        } else {
            SDA_L;
        }
        SPI_Tick();
        
        SCL_H;        // 最后回到CLK=1, 对方在这之后产生中断,然后读入
        SPI_Tick();
    }
}

 

posted on   kehuadong  阅读(492)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示