从零设计编程语言:词法分析、语法分析与解释器实现指南
2026/10/3 9:26:50
今天解决:接屏/Flash 总要试 mode0、mode3?一次记清。
| 线 | 作用 |
|---|---|
| SCK | 主机产生的时钟 |
| MOSI | 主机出、从机入 |
| MISO | 主机入、从机出 |
| CS | 片选,一般低有效 |
全双工,无 ACK,靠 CS 选设备。
| 名称 | 含义 |
|---|---|
| CPOL | 空闲时 SCK 是 0 还是 1 |
| CPHA | 在“第几个边沿”采数据 |
| 模式 | 空闲 | 采样时机 |
|---|---|---|
| 0 | 低 | 上升沿采样 |
| 1 | 低 | 下降沿采样 |
| 2 | 高 | 下降沿采样 |
| 3 | 高 | 上升沿采样 |
从机手册写哪一种,主机就配哪一种;配错会“位错位/读出来像随机”。
#include"stm32f4xx.h"uint8_tspi_xfer_byte(SPI_TypeDef*spi,uint8_tv){while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_TXE)==RESET){}SPI_I2S_SendData(spi,v);while(SPI_I2S_GetFlagStatus(spi,SPI_I2S_FLAG_RXNE)==RESET){}return(uint8_t)SPI_I2S_ReceiveData(spi);}uint8_tspi_read_reg(uint8_treg){uint8_tx;GPIO_ResetBits(GPIOB,GPIO_Pin_0);/* CS 拉低 */(void)spi_xfer_byte(SPI1,reg);x=spi_xfer_byte(SPI1,0xFF);GPIO_SetBits(GPIOB,GPIO_Pin_0);/* CS 拉高 */returnx;}初始化时对应设 CPOL/CPHA(标准库示意):
SPI_InitTypeDef s;s.SPI_Direction=SPI_Direction_2Lines_FullDuplex;s.SPI_Mode=SPI_Mode_Master;s.SPI_DataSize=SPI_DataSize_8b;s.SPI_CPOL=SPI_CPOL_High;/* Mode 3 */s.SPI_CPHA=SPI_CPHA_2Edge;s.SPI_NSS=SPI_NSS_Soft;s.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;s.SPI_FirstBit=SPI_FirstBit_MSB;| 误区 | 正解 |
|---|---|
| 模式随便配 | 必须与从机一致 |
| MOSI/MISO 随便接 | 主出对从入,主入对从出 |
| 多从机都让 MISO 输出 | 只能选中的设备驱动 |
| SPI 必然比 I2C 稳 | 线更长/更快时也要看驱动与负载 |
作者:shuifanyu
标签:SPICPOLCPHA