上图是外设的SPI波形图
STM32F107的配置如下:
能看到MCLK和MOSI,CS的波形,怎么就没有回应呢??
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag , 开启swd
/* 使能SPI1和GPIOA、GPIOB的RCC时钟*/
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//RCC_APB1Periph_SPI3
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SPI3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
SPI_Cmd(SPI3,DISABLE);
/*!初始化时钟信号线SCK */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PC10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*初始化SPI_FLASH_SPI管脚: MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PC12
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*初始化SPI_FLASH_SPI管脚: MISO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_OD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*初始化片选信号管脚: /CS*/
#if 1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif
#if 1
/*拉高片选信号*/
SPI_FLASH_CS_HIGH();
/* SPI1初始化配置*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主从模式选择,SCK信号有主机产生
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI通信数据的大小
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟极性
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //时钟相位
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//SPI_NSS_Soft; //片选信号,硬件模式还是软件模式
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //SPI分频值,分频后的值为SCK的时钟频率
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //选择SPI通信时,是高位数据在前还是低位数据在前
SPI_InitStructure.SPI_CRCPolynomial = 0; //与CRC校验有关
SPI_Init(SPI3, &SPI_InitStructure);
/*使能SPI1 */
SPI_Cmd(SPI3, ENABLE);
/*唤醒SPI FLASH*/
//SPI_Flash_WAKEUP();
#endif
能看到CLK、MOSI、CS的波形,这边“基本”没问题。
现在要考察另一边。
上面一堆代码基本没必要贴出来。
SPI外设器件很多,操作过程五花八门。
看你是什么器件。
比如,可能要先发出命令,然后对方才会有反应。
你好,我是发送了,读ID的指令,
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(0x22);
SPI_FLASH_SendByte(0x00);
SPI_FLASH_SendByte(0x02);
SPI_FLASH_SendByte(0xDB);
SPI_FLASH_SendByte(0xFF);
Temp0 = SPI_FLASH_SendByte(0xA5);
Temp1 = SPI_FLASH_SendByte(0xA5);
Temp2 = SPI_FLASH_SendByte(0xA5);
SPI_FLASH_CS_HIGH();
就是MISO,没什么反应
示波器查mosi,一看数据对不对,二看时序对不对。
首先看CLK边沿与数据位的关系,
比如,数据在哪个边沿出现,哪个边沿要保持。
其次看时间关系,
比如,数据要在边沿前面多久出现,要保持多久。
细节很多。
一周热门 更多>