在 CYBLE-333074-EVAL-M2B 模块中使用 SPI 与外部闪存通信,引脚选择和配置如下:
推荐 SPI 引脚分配
SPI1(主模式)引脚(通过软件配置,非固定物理位置):
- MOSI(主出从入):
P3.0 (可编程为任意未占用 GPIO)
- MISO(主入从出):
P3.1 (可编程为任意未占用 GPIO)
- SCLK(时钟线):
P3.2 (可编程为任意未占用 GPIO)
- CS(片选):
P3.3 (手动控制或通过硬件 CS 功能)
其他可用 GPIO(确保与板载功能无冲突):
⚠️ 注意事项:
- 所有 SPI 引脚需通过 SCB 组件配置为软件可编程引脚。
- 验证选择的引脚是否被板载调试器或传感器占用(避免冲突)。
- 外部闪存的电压等级需与模块 I/O 电压匹配(通常为 1.8V/3.3V)。
代码示例(基于 PSoC Creator)
以下代码演示 SPI 初始化和读写操作(以 Winbond W25Q16 闪存为例):
#include "project.h"
#include
#define SPI_CS_PIN P3_3 // 自定义片选引脚
#define DUMMY_BYTE 0xA5 // 空操作字节
#define READ_CMD 0x03 // 闪存读取指令
void SPI_Init(void) {
// 配置 SPI1 为主机模式,时钟频率 1 MHz
Cy_SCB_SPI_Init(SPI1_HW, &SPI1_config, NULL);
Cy_SCB_SPI_Enable(SPI1_HW);
// 初始化片选引脚
Cy_GPIO_Pin_Init(SPI_CS_PORT, SPI_CS_PIN, &CY_GPIO_PIN_OUTPUT_STRONG);
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 1); // 初始拉高
}
// 从闪存读取数据
void Flash_Read(uint32_t addr, uint8_t *buffer, uint16_t len) {
uint8_t cmd[] = {
READ_CMD,
(uint8_t)(addr >> 16), // 地址高位
(uint8_t)(addr >> 8), // 地址中位
(uint8_t)(addr) // 地址低位
};
// 拉低 CS 开始通信
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 0);
// 发送读命令和地址
Cy_SCB_SPI_WriteArray(SPI1_HW, cmd, 4);
// 接收数据
for (uint16_t i = 0; i < len; i++) {
buffer[i] = Cy_SCB_SPI_Read(SPI1_HW);
}
// 拉高 CS 结束
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 1);
}
int main(void) {
CyGlobalIntEnable;
SPI_Init();
uint8_t data[16];
Flash_Read(0x000000, data, sizeof(data)); // 从地址0读取16字节
while (1);
}
关键步骤
硬件连接:
- 连接 MOSI/MISO/SCLK/CS 到闪存对应引脚。
- 确保共地(GND)并匹配电平(必要时用电平转换器)。
软件配置:
- 在 PSoC Creator 中拖放 SCB(SPI) 组件。
- 设置模式 Master、时钟频率、数据位宽(通常 8-bit)。
- 手动控制片选(CS)以获得更大灵活性。
验证通信:
- 发送闪存的 JEDEC ID 命令(如
0x9F),验证返回的厂商 ID。
- 确保时序符合闪存规格书要求。
参考文档
- CYBLE-333074-EVAL-M2B 用户手册
- PSoC 6 SCB 寄存器手册
- SPI Master 驱动 API 文档
通过上述配置,您可实现稳定的 SPI 通信。根据实际闪存型号调整命令和时序。
在 CYBLE-333074-EVAL-M2B 模块中使用 SPI 与外部闪存通信,引脚选择和配置如下:
推荐 SPI 引脚分配
SPI1(主模式)引脚(通过软件配置,非固定物理位置):
- MOSI(主出从入):
P3.0 (可编程为任意未占用 GPIO)
- MISO(主入从出):
P3.1 (可编程为任意未占用 GPIO)
- SCLK(时钟线):
P3.2 (可编程为任意未占用 GPIO)
- CS(片选):
P3.3 (手动控制或通过硬件 CS 功能)
其他可用 GPIO(确保与板载功能无冲突):
⚠️ 注意事项:
- 所有 SPI 引脚需通过 SCB 组件配置为软件可编程引脚。
- 验证选择的引脚是否被板载调试器或传感器占用(避免冲突)。
- 外部闪存的电压等级需与模块 I/O 电压匹配(通常为 1.8V/3.3V)。
代码示例(基于 PSoC Creator)
以下代码演示 SPI 初始化和读写操作(以 Winbond W25Q16 闪存为例):
#include "project.h"
#include
#define SPI_CS_PIN P3_3 // 自定义片选引脚
#define DUMMY_BYTE 0xA5 // 空操作字节
#define READ_CMD 0x03 // 闪存读取指令
void SPI_Init(void) {
// 配置 SPI1 为主机模式,时钟频率 1 MHz
Cy_SCB_SPI_Init(SPI1_HW, &SPI1_config, NULL);
Cy_SCB_SPI_Enable(SPI1_HW);
// 初始化片选引脚
Cy_GPIO_Pin_Init(SPI_CS_PORT, SPI_CS_PIN, &CY_GPIO_PIN_OUTPUT_STRONG);
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 1); // 初始拉高
}
// 从闪存读取数据
void Flash_Read(uint32_t addr, uint8_t *buffer, uint16_t len) {
uint8_t cmd[] = {
READ_CMD,
(uint8_t)(addr >> 16), // 地址高位
(uint8_t)(addr >> 8), // 地址中位
(uint8_t)(addr) // 地址低位
};
// 拉低 CS 开始通信
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 0);
// 发送读命令和地址
Cy_SCB_SPI_WriteArray(SPI1_HW, cmd, 4);
// 接收数据
for (uint16_t i = 0; i < len; i++) {
buffer[i] = Cy_SCB_SPI_Read(SPI1_HW);
}
// 拉高 CS 结束
Cy_GPIO_Write(SPI_CS_PORT, SPI_CS_PIN, 1);
}
int main(void) {
CyGlobalIntEnable;
SPI_Init();
uint8_t data[16];
Flash_Read(0x000000, data, sizeof(data)); // 从地址0读取16字节
while (1);
}
关键步骤
硬件连接:
- 连接 MOSI/MISO/SCLK/CS 到闪存对应引脚。
- 确保共地(GND)并匹配电平(必要时用电平转换器)。
软件配置:
- 在 PSoC Creator 中拖放 SCB(SPI) 组件。
- 设置模式 Master、时钟频率、数据位宽(通常 8-bit)。
- 手动控制片选(CS)以获得更大灵活性。
验证通信:
- 发送闪存的 JEDEC ID 命令(如
0x9F),验证返回的厂商 ID。
- 确保时序符合闪存规格书要求。
参考文档
- CYBLE-333074-EVAL-M2B 用户手册
- PSoC 6 SCB 寄存器手册
- SPI Master 驱动 API 文档
通过上述配置,您可实现稳定的 SPI 通信。根据实际闪存型号调整命令和时序。
举报