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、效果显示

串口输出结果

经验分享 程序员 微信小程序 职场和发展