找到以前做的一块扩展外设功能板,利用AT32F425先测试一下SPI接口的FLASH。紫色那个是自己以前做的扩展板。
板上带有SPI FLASH,TF卡座;
SPI接口的2.4寸tftlcd,带电阻触摸XT2046;
I2C接口的加速度传感器ADXL345.光照传感器rpr-0521rs。
外加几个按键和轴了。
下面先测试下FLASH,型号是W25Q128。
扩展板SPI flash接口如下,
下面找到AT-START-F425开发板对应的引脚如下。
对应:
FLASH CS = PB3
FLASH SCK = PA5
FLASH MISO = PA6
FLASH MOSI = PA7
在AT-START-F425开发板的资料例程找到了一个flash例程。修改了一下cs的管教。基本就可以用的。
主要代码:
- #include "at32f425_board.h"
- #include "at32f425_clock.h"
- #include "at32f425_int.h"
- #include "spi_flash.h"
- /** @addtogroup AT32F425_periph_examples
- * @{
- */
- void _delay_ms(uint32_t ms)
- {
- uint32_t g_ms_tick;
- g_ms_tick = hal_get_tick();
- while(hal_get_tick() - g_ms_tick < ms);
- }
-
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] systick interrupt handler.
- * @param none
- * @retval none
- */
- void systick_handler(void)
- {
- }
- #define FLASH_TEST_ADDR 0x1000
- #define BUF_SIZE 0x500
- uint8_t tx_buffer[BUF_SIZE];
- uint8_t rx_buffer[BUF_SIZE];
- volatile error_status transfer_status = ERROR;
- void tx_data_fill(void);
- error_status buffer_compare(uint8_t* pbuffer1, uint8_t* pbuffer2, uint16_t buffer_length);
- /**
- * @brief transfer data fill.
- * @param none
- * @retval none
- */
- void tx_data_fill(void)
- {
- uint32_t data_index = 0;
- for(data_index = 0; data_index < BUF_SIZE; data_index++)
- {
- tx_buffer[data_index] = data_index+0X55;
- }
- }
- /**
- * @brief buffer compare function.
- * @param pbuffer1, pbuffer2: buffers to be compared.
- * @param buffer_length: buffer's length
- * @retval the result of compare
- */
- error_status buffer_compare(uint8_t* pbuffer1, uint8_t* pbuffer2, uint16_t buffer_length)
- {
- while(buffer_length--)
- {
- if(*pbuffer1 != *pbuffer2)
- {
- return ERROR;
- }
- pbuffer1++;
- pbuffer2++;
- }
- return SUCCESS;
- }
- /**
- * @brief main function.
- * @param none
- * @retval none
- */
- int main(void)
- {
- __IO uint32_t index = 0;
- __IO uint32_t flash_id_index = 0;
- system_clock_config();
- /* config systick clock source */
- systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);
- /* config systick reload value and enable interrupt */
- SysTick_Config(system_core_clock / 1000);
- /* configure led */
- at32_led_init(LED2);
- at32_led_init(LED3);
- uart_print_init(115200);
- printf("AT32F425 Test\r\n");
-
- tx_data_fill();
- spiflash_init();
- flash_id_index = spiflash_read_id();
- if(flash_id_index != W25Q128)
- {
- printf("flash id check error!\r\n");
- for(index = 0; index < 50; index++)
- {
- at32_led_toggle(LED2);
- at32_led_toggle(LED3);
- _delay_ms(200);
- }
- return 1;
- }
- else
- {
- printf("flash id check success! id: %X\r\n", flash_id_index);
- }
- /* erase sector */
- spiflash_sector_erase(FLASH_TEST_ADDR / SPIF_SECTOR_SIZE);
- /* write data */
- spiflash_write(tx_buffer, FLASH_TEST_ADDR, BUF_SIZE);
- /* read data */
- spiflash_read(rx_buffer, FLASH_TEST_ADDR, BUF_SIZE);
- /* printf read data */
- printf("Read Data: ");
- for(index = 0; index < BUF_SIZE; index++)
- {
- printf("%02X ", rx_buffer[index]);
- }
- /* test result:the data check */
- transfer_status = buffer_compare(rx_buffer, tx_buffer, BUF_SIZE);
- /* test result indicate:if SUCCESS ,led2 lights */
- if(transfer_status == SUCCESS)
- {
- printf("\r\nflash data read write success!\r\n");
- at32_led_on(LED2);
- }
- else
- {
- printf("\r\nflash data read write ERROR!\r\n");
- at32_led_off(LED2);
- }
-
- while(1)
- {
- }
- }
通过串口输出信息:
测试读写成功,型号标志EF17.对应W25Q128.
|