Keil™, An ARM® Company

RL-ARM User's Guide

Technical Support

On-Line Manuals

RL-ARM User's Guide

RL-RTX RL-FlashFS RL-TCPnet RL-CAN Example Programs Library Reference Data Types BIT BOOL CAN_ERROR CAN_msg FILE S8 S16 S32 S64 U8 U16 U32 U64 Include Files can_cfg.h file_config.h net_config.h rtl.h rtx_can.h rtx_config.h stdio.h Reference _alloc_box _calloc_box _declare_box _declare_box8 _free_box _init_box _init_box8 arp_cache_ip CAN_init CAN_receive CAN_request CAN_rx_object CAN_send CAN_set CAN_start CAN_tx_object cgi_func cgi_process_data cgi_process_var cgx_content_type com_getchar com_putchar com_tx_active dhcp_disable fanalyse fcheck fclose fdefrag fdelete feof ferror ffind fflush fformat ffree fgetc fgets finit fopen fprintf fputc fputs fread frename fs_EraseSector fs_get_date fs_get_time fs_Init fs_ProgramPage fs_spi_EraseSector fs_spi_Init fs_spi_ProgramPage fs_spi_ReadData fscanf fseek ftell ftp_fclose ftp_fdelete ftp_ffind ftp_fopen ftp_fread ftp_frename ftp_fwrite fwrite get_host_by_name http_accept_host http_date http_fclose http_fgets http_finfo http_fopen http_fread http_get_content_type http_get_info http_get_lang http_get_session http_get_var igmp_join igmp_leave init_ethernet init_modem init_serial init_TcpNet int_disable_eth int_enable_eth interrupt_ethernet isr_evt_set isr_mbx_check isr_mbx_receive isr_mbx_send isr_sem_send main_TcpNet mci_init mci_read_config mci_read_sect mci_write_sect modem_dial modem_hangup modem_listen modem_online modem_process modem_run os_dly_wait os_evt_clr os_evt_get os_evt_set os_evt_wait_and os_evt_wait_or os_itv_set os_itv_wait os_mbx_check os_mbx_declare os_mbx_init os_mbx_send os_mbx_wait os_mut_init os_mut_release os_mut_wait os_sem_init os_sem_send os_sem_wait os_sys_init os_sys_init_prio os_sys_init_user os_tmr_call os_tmr_create os_tmr_kill os_tsk_create os_tsk_create_ex os_tsk_create_user os_tsk_create_user_ex os_tsk_delete os_tsk_delete_self os_tsk_pass os_tsk_prio os_tsk_prio_self os_tsk_self poll_ethernet ppp_close ppp_connect ppp_is_up ppp_listen rewind send_frame slip_close slip_connect slip_is_up slip_listen smtp_accept_auth smtp_cbfunc smtp_connect snmp_trap spi_hi_speed spi_init spi_send spi_ss tcp_abort tcp_check_send tcp_close tcp_connect tcp_get_buf tcp_get_socket tcp_get_state tcp_listen tcp_max_dsize tcp_release_socket tcp_reset_window tcp_send tftp_fclose tftp_fopen tftp_fread tftp_fwrite timer_tick tnet_cbfunc tnet_ccmp tnet_get_info tnet_msg_poll tnet_process_cmd tnet_set_delay tsk_lock tsk_unlock udp_close udp_get_buf udp_get_socket udp_mcast_ttl udp_open udp_release_socket udp_send ungetc Library Files Appendix

fs_spi_ProgramPage

Summary
#include <file_config.h>

int fs_spi_ProgramPage (
    U32 adr,     /* data page address */
    U32 size,    /* size of the data page */
    U8 *buf);    /* buffer containing the data */
Description

The fs_spi_ProgramPage is a user-provided routine that programs the contents of buf into SPI Data Flash memory starting at address adr for size bytes.

The adr must be 4-byte aligned, but buf may be not. The buffer size must be a multiple of 4.

The fs_spi_ProgramPage function is part of RL-FlashFS. The prototype is defined in file_config.h. You can customize the function in fs_spi_flashprg.c.

Return Value

The fs_spi_ProgramPage function returns a value of 0 if successful or a value of 1 if unsuccessful.

See Also

finit, fs_spi_EraseSector, fs_spi_Init, fs_spi_ReadData

Example
int fs_spi_ProgramPage (U32 adr, U32 sz, U8 *buf) {
  U32 cnt;
  U8  sr;

  while (sz) {
    cnt = PAGE_SZ - (adr & (PAGE_SZ - 1));
    if (cnt > sz) cnt = sz;

    /* Write Enable */
    spi_ss (0);
    spi_send (SPI_WRITE_ENABLE);
    spi_ss (1);

    /* Program Page */
    spi_ss (0);
    spi_send (SPI_PAGE_PROGRAM);
    spi_send ((U8)(adr >> 16));
    spi_send ((U8)(adr >>  8));
    spi_send ((U8)(adr >>  0));
    adr += cnt;
    sz  -= cnt;
    while (cnt--) {
      spi_send (*buf++);
    }
    spi_ss (1);

    /* Wait until done */
    spi_ss (0);
    spi_send (SPI_READ_SR);
    do {
      sr = spi_send (0xFF);
    } while (sr & SR_WIP);
    spi_ss (1);

    /* Check for Error */
    if (sr & SR_P_FAIL) {
      spi_ss (0);
      spi_send (SPI_CLEAR_SR_FLAGS);
      spi_ss (1);
      return (1);
    }
  }
  return (0);
}