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、效果显示
串口输出结果