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 2023-02-19 15:24  kehuadong  阅读(441)  评论(0编辑  收藏  举报

导航