Maix Bit(K210) 裸机 开发教程(四)Flash 使用
Maix Bit 有一个128M bit的flash,使用SPI驱动。
1、代码获取
KendryteIDE SDK开发官方的一些例程下载链接: 找到flash的Demo 选择flash的任意一个都可以。
2、常用API
更多API的使用见SDK开发文档。 初始化:
void spi_init(spi_device_num_t spi_num, spi_work_mode_t work_mode, spi_frame_format_t frame_format,
size_t data_bit_length, uint32_t endian)
设置SPI始终频率:
uint32_t spi_set_clk_rate(spi_device_num_t spi_num, uint32_t spi_clk)
标准模式下接受函数:
void spi_receive_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *cmd_buff,
size_t cmd_len, uint8_t *rx_buff, size_t rx_len)
标准模式传输模式:
void spi_send_data_standard(spi_device_num_t spi_num, spi_chip_select_t chip_select, const uint8_t *cmd_buff,
size_t cmd_len, const uint8_t *tx_buff, size_t tx_len)
多线模式下设置指令长度、地址长度、等待时钟数、指令地址传输模式:
void spi_init_non_standard(spi_device_num_t spi_num, uint32_t instruction_length, uint32_t address_length,
uint32_t wait_cycles, spi_instruction_address_trans_mode_t instruction_address_trans_mode)
3、代码修改
#include <stdio.h>
#include "fpioa.h"
#include "sysctl.h"
#include "uarths.h"
#include "w25qxx.h"
#define TEST_NUMBER (40 * 1024 + 5)
#define DATA_ADDRESS 0xB00000
uint8_t data_buf[TEST_NUMBER];
int main(void) {
uint8_t i;
sysctl_pll_set_freq(SYSCTL_PLL0, 800000000);
uarths_init();
uint8_t manuf_id, device_id;
uint32_t index, spi_index;
spi_index = 3;
printf("spi%d master test
", spi_index);
w25qxx_init(spi_index, 0, 60000000);
w25qxx_read_id(&manuf_id, &device_id);
printf("manuf_id:0x%02x, device_id:0x%02x
", manuf_id, device_id);
if ((manuf_id != 0xEF && manuf_id != 0xC8) ||
(device_id != 0x17 && device_id != 0x16)) {
printf("manuf_id:0x%02x, device_id:0x%02x
", manuf_id, device_id);
return 0;
}
printf("write data
");
for (index = 0; index < TEST_NUMBER; index++) {
data_buf[index] = (uint8_t)(index);
// if (index % 10 == 0) {
// printf("%d ", data_buf[index]);
// }
}
for (i = 0; i < 254; i++) {
printf("Data%d: %d ", i, data_buf[i]);
}
/*write data*/
uint64_t start = sysctl_get_time_us();
w25qxx_write_data(DATA_ADDRESS, data_buf, TEST_NUMBER);
uint64_t stop = sysctl_get_time_us();
printf("%ld us
", (stop - start));
for (index = 0; index < TEST_NUMBER; index++) data_buf[index] = 0;
start = sysctl_get_time_us();
w25qxx_read_data(DATA_ADDRESS, data_buf, TEST_NUMBER);
stop = sysctl_get_time_us();
printf("read %ld us
", (stop - start));
for (index = 0; index < TEST_NUMBER; index++) {
if (data_buf[index] != (uint8_t)(index)) {
printf("quad fast read test error
");
return 0;
}
}
for (i = 0; i < 254; i++) {
printf("Data%d: %d ", i, data_buf[i]);
}
printf("spi%d master test ok
", spi_index);
while (1)
;
return 0;
}
添加一些测试代码,查看数据是否正确,输出0-254 之间的数字。
4、效果显示
串口输出结果
