写一个MM32F0144C6P对于W25Q128的读ID代码
时间: 2023-12-01 10:27:37 浏览: 38
好的,以下是MM32F0144C6P读取W25Q128的ID代码:
```c
#include "mm32f014.h"
/* 定义W25Q128的命令 */
#define W25Q128_CMD_JEDEC_ID 0x9F
/* 定义W25Q128的ID信息 */
#define W25Q128_MANUFACTURER_ID 0xEF
#define W25Q128_MEMORY_TYPE_ID 0x40
#define W25Q128_CAPACITY_ID 0x18
/* 定义W25Q128的SPI Flash片选 */
#define W25Q128_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define W25Q128_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
/* 定义SPI Flash的读写命令 */
#define SPI_FLASH_CMD_READ 0x03
/* 定义SPI Flash的地址和数据长度 */
#define SPI_FLASH_ADDR_LEN 3
#define SPI_FLASH_DATA_LEN 1
/* 初始化SPI Flash */
void SPI_FLASH_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* 使能SPI时钟和GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
/* 配置PA4为GPIO输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置PA5、PA6、PA7为SPI模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置SPI模式 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* 使能SPI */
SPI_Cmd(SPI1, ENABLE);
}
/* 向SPI Flash发送一个字节的数据 */
uint8_t SPI_FLASH_SendByte(uint8_t byte)
{
/* 等待发送缓冲区为空 */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* 发送一个字节的数据 */
SPI_I2S_SendData(SPI1, byte);
/* 等待接收缓冲区非空 */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* 返回接收到的数据 */
return SPI_I2S_ReceiveData(SPI1);
}
/* 读取SPI Flash的JEDEC ID */
void SPI_FLASH_ReadJEDECID(uint8_t *id_data)
{
/* 使能SPI Flash片选 */
W25Q128_CS_LOW();
/* 发送读JEDEC ID命令 */
SPI_FLASH_SendByte(W25Q128_CMD_JEDEC_ID);
/* 读取JEDEC ID信息 */
id_data[0] = SPI_FLASH_SendByte(0xFF);
id_data[1] = SPI_FLASH_SendByte(0xFF);
id_data[2] = SPI_FLASH_SendByte(0xFF);
/* 禁用SPI Flash片选 */
W25Q128_CS_HIGH();
}
/* 主函数 */
int main(void)
{
uint8_t jedec_id[3];
/* 初始化SPI Flash */
SPI_FLASH_Init();
/* 读取SPI Flash的JEDEC ID */
SPI_FLASH_ReadJEDECID(jedec_id);
/* 判断SPI Flash是否为W25Q128 */
if (jedec_id[0] == W25Q128_MANUFACTURER_ID &&
jedec_id[1] == W25Q128_MEMORY_TYPE_ID &&
jedec_id[2] == W25Q128_CAPACITY_ID)
{
/* SPI Flash是W25Q128 */
// ...
}
else
{
/* SPI Flash不是W25Q128 */
// ...
}
while (1);
}
```
上述代码中,定义了W25Q128的命令和ID信息,以及SPI Flash的读写命令、地址和数据长度。在SPI_FLASH_Init函数中,初始化了SPI Flash的GPIO和SPI模式,并使能了SPI。在SPI_FLASH_SendByte函数中,向SPI Flash发送一个字节的数据,并返回接收到的数据。在SPI_FLASH_ReadJEDECID函数中,向SPI Flash发送读JEDEC ID命令,并读取JEDEC ID信息。在主函数中,调用SPI_FLASH_ReadJEDECID函数,读取SPI Flash的JEDEC ID,并判断是否为W25Q128。