1、嵌入式系统设计(基于STM32F429)第 15 章课后题参考答案1. SPI 多机通信时,主机怎么区别各个从机? 答:来自主机的片选信号用于选择从机,它通常是一个低电平有效信号,拉高时从机与 SPI 总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。2. 描述 CPOL 极性和 CPHA 相位的组合形式。答:根据 CPOL 位和 CPHA 位的选择,有 4 种SPI 模式可用。SPI 模式CPOL 位CPHA 位空闲时时钟极性采样/移位数据的时钟相位000低电平第一个边沿,数据在上升沿采样,在下降沿移出101低电平第二个边沿,数据在下降沿采样,在上升沿移出210高电平第一
2、个边沿,数据在下降沿采样,在上升沿移出311高电平第二个边沿,数据在上升沿采样,在下降沿移出参考教材 15.1.3 小节。3. 根据 SPI 结构,描述 SPI 怎么实现读操作,并绘制相应的数据传输流图。答:根据 通信结构,MOSI、MISO、SPI 主机和 SPI 从机内部的数据寄存器构成一个数据串行传输的环路, 在时钟的控制下实现数据的环形传输。因此。SPI 主机读数据时,需要先写任意数据到SPI_DR 寄存器。操作流程如下:通过将SPE位置1来使能SPI将任意数据数据写入SPI_DR等待至RXNE=1,读取SPI_DR以获取接需要读取的数据4. 说明 SPI 接口 Flash 各个引脚的
3、功能,以及Flash 怎么和 SPI 控制器连接。答:以 SPI 接口Flash W25Q16 为例。/CS:片选引脚,低电平有效。SPI 通信时片选信号一般使用GPIO 单独控制。DO:数据输出。/WP:写保护,低电平时只能读,高电平时可读写。GND:接地。DI:数据输入。CLK:时钟。/HOLD:数据暂停控制,低电平代表暂停,高电平工作,通常用于多个设备共享一个 SPI,如果只有一主一从,可以把这引脚接 VCC。VCC:2.73.6V。W25Q16 和 STM32F429 连接电路图如下所示:5. 尝试编写 SPI 主机的软件模拟程序,使用SPI 模式 2。答:在 SPI 模式 2 下,C
4、POL=1,表示时钟的空闲状态为高电平。CPHA=0,数据在第一个边沿(下降沿) 采样,并且数据在接下来时钟信号的上升沿移出。假设 SPI 通信引脚对应关系如下:PF7SCK PF8MISOPF9MOSIPF6CS#define SCK_H GPIO_SetBits(GPIOF, GPIO_Pin_7) #define SCK _L GPIO_ResetBits (GPIOF, GPIO_Pin_7) #define MOSI_H GPIO_SetBits(GPIOF, GPIO_Pin_9) #define MOSI_L GPIO_ResetBits (GPIOF, GPIO_Pin_9)#
5、define MISOGPIO_ReadInputDataBit (GPIOF, GPIO_Pin_8)#define CS_H GPIO_SetBits(GPIOF, GPIO_Pin_6) #define CS _L GPIO_ResetBits (GPIOF, GPIO_Pin_6)(1)SPI GPIO 引脚初始化void SPI_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);/设置引脚复用/*! 配 置 SPI 引 脚
6、 : SCK 、 MOSI 、 CS*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF, &
7、GPIO_InitStructure);/*! 配 置 SPI 引 脚 : MISO */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(GPIOF, &GPIO_InitStructure);(2)SPI 模式 2 通信函数uint8_t SOFT_SPI_RW_MODE2(uint8_t byte)uint8_t i,Temp=0;CS _L; /使能 SPI 通信for(i=0;i8;i+)/ 循环 8 次if(byte&0x80)elseM
8、OSI_H; /若最到位为高,则输出高MOSI_L;/若最到位为低,则输出低byte = 1;/ 低一位移位到最高位delay_us(1);SCK_L;/拉低时钟Temp 擦除 - 烧写。8. 编写程序,向 W25Q16 连续写 100 个字节数据,写入开始地址为 0x03。答:参考教材 15.4 小节中 SPI Flash 常用操作函数 中的 Flash 任意写函数。/* brief 对 FLASH 写入数据,调用本函数写入数据前需要先擦除扇区* parampBuffer,要写入数据的指针* param WriteAddr,写入地址* param Num,写入数据长度* retval 无*/void SPI_Flash_Write(u8* pBuffer, u32 WriteAddr, u16 Num)。pBuffer:假设数据存储在数组 u8 Data_Buff100 WriteAddr:0x03Num:100功能实现函数:SPI_Flash_Write(Data_Buff, 0x03, 100);