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();
}
}