打印
[Atmel]

用ASF跑SAMD21程序(12) EEPROM

[复制链接]
5429|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SAMD21板子上有一片SPI接口的EEPROM,不错,今天驱动它。

首先在前一个工程基础上添加EEPROM模块。



再打开ASF EXPLOER 找到快速开始说明文档。



编译时提示少了管脚定义,这时可以增加一个.h文件。


#ifndef CONF_AT25DFX_H_INCLUDED
#define CONF_AT25DFX_H_INCLUDED

#include <board.h>
#include "at25dfx.h"

//! Select the SPI module AT25DFx is connected to
#define AT25DFX_SPI                 SERIALFLASH_SPI_MODULE

/** AT25DFx device type */
#define AT25DFX_MEM_TYPE            AT25DFX_081A

#define AT25DFX_SPI_PINMUX_SETTING  SERIALFLASH_SPI_MUX_SETTING
#define AT25DFX_SPI_PINMUX_PAD0     SERIALFLASH_SPI_PINMUX_PAD0
#define AT25DFX_SPI_PINMUX_PAD1     SERIALFLASH_SPI_PINMUX_PAD1
#define AT25DFX_SPI_PINMUX_PAD2     SERIALFLASH_SPI_PINMUX_PAD2
#define AT25DFX_SPI_PINMUX_PAD3     SERIALFLASH_SPI_PINMUX_PAD3

#define AT25DFX_CS                  SERIALFLASH_SPI_CS

//! SPI master speed in Hz.
#define AT25DFX_CLOCK_SPEED         120000

#endif  /* CONF_AT25DFX_H_INCLUDED */
这时再编译则编译通过。时钟配置不用改变。但写EEPROM顺序注意一下。有时写保护打开时才可写入,读出是在保护加上时才可读出。
结果我用两种方式,一个是灯亮一下,写完灯灭,再有一种是通过串口输出信息结果如下:



程序清单列出:


/**
* \file
*
* \brief Empty user application template
*
*/

/**
* \mainpage User Application template doxygen documentation
*
* \par Empty user application template
*
* This is a bare minimum user application template.
*
* For documentation of the board, go \ref group_common_boards "here" for a link
* to the board-specific documentation.
*
* \par Content
*
* -# Include the ASF header files (through asf.h)
* -# Minimal main function that starts with a call to system_init()
* -# Basic usage of on-board LED and button
* -# "Insert application code here" comment
*
*/

/*
* Include header files for all drivers that have been imported from
* Atmel Software Framework (ASF).
*/
#include <asf.h>
#include <stdio_serial.h>
#include "conf_at25dfx.h"

bool volatile callback_status = false;

void configure_usart(void);



struct usart_module usart_instance;

void configure_usart(void)
{   
         struct usart_config config_usart;
         usart_get_config_defaults(&config_usart);
         config_usart.baudrate    = 9600;
         config_usart.mux_setting = EXT3_UART_SERCOM_MUX_SETTING;
         config_usart.pinmux_pad0 = EXT3_UART_SERCOM_PINMUX_PAD0;
         config_usart.pinmux_pad1 = EXT3_UART_SERCOM_PINMUX_PAD1;
         config_usart.pinmux_pad2 = EXT3_UART_SERCOM_PINMUX_PAD2;
         config_usart.pinmux_pad3 = EXT3_UART_SERCOM_PINMUX_PAD3;
         
         while (usart_init(&usart_instance, EXT3_UART_MODULE, &config_usart) != STATUS_OK)
          {    }
          stdio_serial_init(&usart_instance, EXT3_UART_MODULE, &config_usart);
          usart_enable(&usart_instance);
}

#define AT25DFX_BUFFER_SIZE  (10)
static uint8_t read_buffer[AT25DFX_BUFFER_SIZE];
static uint8_t write_buffer[AT25DFX_BUFFER_SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
struct spi_module at25dfx_spi;
struct at25dfx_chip_module at25dfx_chip;

static void at25dfx_init(void)
{
            struct at25dfx_chip_config at25dfx_chip_config;
                struct spi_config at25dfx_spi_config;
                at25dfx_spi_get_config_defaults(&at25dfx_spi_config);
                at25dfx_spi_config.mode_specific.master.baudrate = AT25DFX_CLOCK_SPEED;
                at25dfx_spi_config.mux_setting = AT25DFX_SPI_PINMUX_SETTING;
                at25dfx_spi_config.pinmux_pad0 = AT25DFX_SPI_PINMUX_PAD0;
                at25dfx_spi_config.pinmux_pad1 = AT25DFX_SPI_PINMUX_PAD1;
                at25dfx_spi_config.pinmux_pad2 = AT25DFX_SPI_PINMUX_PAD2;
                at25dfx_spi_config.pinmux_pad3 = AT25DFX_SPI_PINMUX_PAD3;
                spi_init(&at25dfx_spi, AT25DFX_SPI, &at25dfx_spi_config);
                spi_enable(&at25dfx_spi);
                at25dfx_chip_config.type = AT25DFX_MEM_TYPE;
                at25dfx_chip_config.cs_pin = AT25DFX_CS;
                at25dfx_chip_init(&at25dfx_chip, &at25dfx_spi, &at25dfx_chip_config);
}
uint8_t i;       
int main (void)
{
       
        system_init();
        configure_usart();
        at25dfx_init();
        uint8_t string[] = "This is AT25DFX test!\r\n";
        uint8_t string2[] = "This is AT25DFX test Good,Very Happy!\r\n";
       
        usart_write_buffer_wait(&usart_instance, string, sizeof(string));
       
       
                   system_interrupt_enable_global();
         at25dfx_chip_wake(&at25dfx_chip);
          port_pin_set_output_level(LED_0_PIN, false);
         if (at25dfx_chip_check_presence(&at25dfx_chip) != STATUS_OK)
         {        // Handle missing or non-responsive device
         }   
         at25dfx_chip_read_buffer(&at25dfx_chip, 0x0000, read_buffer, AT25DFX_BUFFER_SIZE);
         at25dfx_chip_set_sector_protect(&at25dfx_chip, 0x10000, false);
         at25dfx_chip_erase_block(&at25dfx_chip, 0x10000, AT25DFX_BLOCK_SIZE_4KB);
         at25dfx_chip_write_buffer(&at25dfx_chip, 0x10000, write_buffer, AT25DFX_BUFFER_SIZE);
          
          
          
         at25dfx_chip_set_global_sector_protect(&at25dfx_chip, true);
          at25dfx_chip_read_buffer(&at25dfx_chip, 0x10000, read_buffer, AT25DFX_BUFFER_SIZE);
          for(i=0;i<=11;i++)
          {
                  if(read_buffer[i]!= write_buffer[i])
                  {
                          break;
                  }
                  
                  
          }
          if (i<= 11)
          {
                  printf("the test is good!!!");
          }
         at25dfx_chip_sleep(&at25dfx_chip);
          
           port_pin_set_output_level(LED_0_PIN, true);
          while (true)
          {
                        ;
     }
}



运行时截图:




相关帖子

沙发
老鱼探戈| | 2015-1-1 21:52 | 只看该作者
抢沙发,点赞!

使用特权

评论回复
板凳
lvyunhua| | 2015-1-1 22:05 | 只看该作者
楼主加油!支持!

使用特权

评论回复
地板
ddllxxrr|  楼主 | 2015-1-2 15:49 | 只看该作者
老鱼探戈 发表于 2015-1-1 21:52
抢沙发,点赞!

使用特权

评论回复
5
ddllxxrr|  楼主 | 2015-1-2 15:49 | 只看该作者
lvyunhua 发表于 2015-1-1 22:05
楼主加油!支持!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6950

帖子

67

粉丝