|
|
|
|
@ -74,16 +74,16 @@ static void gpio_configuration(spi_user_data_t spi) {
|
|
|
|
|
static void spi_configuration(spi_user_data_t spi) {
|
|
|
|
|
SPI_InitTypeDef SPI_InitStructure;
|
|
|
|
|
|
|
|
|
|
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI 设置为双线双向全双工
|
|
|
|
|
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主 SPI
|
|
|
|
|
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI 发送接收 8 位帧结构
|
|
|
|
|
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
|
|
|
|
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第一个时钟沿
|
|
|
|
|
//TODO 以后可以尝试硬件 CS
|
|
|
|
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //内部 NSS 信号由 SSI 位控制
|
|
|
|
|
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为 2
|
|
|
|
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
|
|
|
|
|
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC 值计算的多项式
|
|
|
|
|
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI 设置为双线双向全双工
|
|
|
|
|
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主 SPI
|
|
|
|
|
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI 发送接收 8 位帧结构
|
|
|
|
|
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
|
|
|
|
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第一个时钟沿
|
|
|
|
|
//TODO 以后可以尝试硬件 CS
|
|
|
|
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //内部 NSS 信号由 SSI 位控制
|
|
|
|
|
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为 2
|
|
|
|
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
|
|
|
|
|
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC 值计算的多项式
|
|
|
|
|
|
|
|
|
|
SPI_I2S_DeInit(spi->spix);
|
|
|
|
|
SPI_Init(spi->spix, &SPI_InitStructure);
|
|
|
|
|
@ -117,15 +117,15 @@ static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, si
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GPIO_ResetBits(spi_dev->cs_gpiox, spi_dev->cs_gpio_pin);
|
|
|
|
|
/* 开始读写数据 */
|
|
|
|
|
/* 开始读写数据 */
|
|
|
|
|
for (size_t i = 0, retry_times; i < write_size + read_size; i++) {
|
|
|
|
|
/* 先写缓冲区中的数据到 SPI 总线,数据写完后,再写 dummy(0xFF) 到 SPI 总线 */
|
|
|
|
|
/* 先写缓冲区中的数据到 SPI 总线,数据写完后,再写 dummy(0xFF) 到 SPI 总线 */
|
|
|
|
|
if (i < write_size) {
|
|
|
|
|
send_data = *write_buf++;
|
|
|
|
|
} else {
|
|
|
|
|
send_data = SFUD_DUMMY_DATA;
|
|
|
|
|
}
|
|
|
|
|
/* 发送数据 */
|
|
|
|
|
/* 发送数据 */
|
|
|
|
|
retry_times = 1000;
|
|
|
|
|
while (SPI_I2S_GetFlagStatus(spi_dev->spix, SPI_I2S_FLAG_TXE) == RESET) {
|
|
|
|
|
SFUD_RETRY_PROCESS(NULL, retry_times, result);
|
|
|
|
|
@ -134,7 +134,7 @@ static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, si
|
|
|
|
|
goto exit;
|
|
|
|
|
}
|
|
|
|
|
SPI_I2S_SendData(spi_dev->spix, send_data);
|
|
|
|
|
/* 接收数据 */
|
|
|
|
|
/* 接收数据 */
|
|
|
|
|
retry_times = 1000;
|
|
|
|
|
while (SPI_I2S_GetFlagStatus(spi_dev->spix, SPI_I2S_FLAG_RXNE) == RESET) {
|
|
|
|
|
SFUD_RETRY_PROCESS(NULL, retry_times, result);
|
|
|
|
|
@ -143,7 +143,7 @@ static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, si
|
|
|
|
|
goto exit;
|
|
|
|
|
}
|
|
|
|
|
read_data = SPI_I2S_ReceiveData(spi_dev->spix);
|
|
|
|
|
/* 写缓冲区中的数据发完后,再读取 SPI 总线中的数据到读缓冲区 */
|
|
|
|
|
/* 写缓冲区中的数据发完后,再读取 SPI 总线中的数据到读缓冲区 */
|
|
|
|
|
if (i >= write_size) {
|
|
|
|
|
*read_buf++ = read_data;
|
|
|
|
|
}
|
|
|
|
|
@ -167,13 +167,13 @@ sfud_err sfud_spi_port_init(sfud_flash *flash) {
|
|
|
|
|
|
|
|
|
|
switch (flash->index) {
|
|
|
|
|
case SFUD_SST25_DEVICE_INDEX: {
|
|
|
|
|
/* RCC 初始化 */
|
|
|
|
|
/* RCC 初始化 */
|
|
|
|
|
rcc_configuration(&spi1);
|
|
|
|
|
/* GPIO 初始化 */
|
|
|
|
|
/* GPIO 初始化 */
|
|
|
|
|
gpio_configuration(&spi1);
|
|
|
|
|
/* SPI 外设初始化 */
|
|
|
|
|
/* SPI 外设初始化 */
|
|
|
|
|
spi_configuration(&spi1);
|
|
|
|
|
/* 同步 Flash 移植所需的接口及数据 */
|
|
|
|
|
/* 同步 Flash 移植所需的接口及数据 */
|
|
|
|
|
flash->spi.wr = spi_write_read;
|
|
|
|
|
flash->spi.lock = spi_lock;
|
|
|
|
|
flash->spi.unlock = spi_unlock;
|
|
|
|
|
|