spi8.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 239 行

C
239
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2007
 *
 *    File name   : spi8.c
 *    Description : Main file
 *
 *    History :
 *    1. Date        : September 6, 2007
 *       Author      : Stanimir Bonev
 *       Description : Create
 *
 *  This example project shows how to use the IAR Embedded Workbench for ARM
 * to develop code for the Samsung-S3F4A0K evaluation board. It shows
 * basic use of SPI 8 bits. It use SPI channel 0 to write and read data from EEPROM
 * SPI memory 25650.
 *
 * Jumpers:
 *  All jumpers are in default position regarding board's manual
 *
 *    $Revision: 18084 $
 **************************************************************************/
#include <samsung\ios3f4a0k.h>
#include <assert.h>
#include "arm_comm.h"
#include "board.h"
#include "gic.h"

#define CS_H()  PIO0_SODR  = 1UL<<15
#define CS_L()  PIO0_CODR  = 1UL<<15

// SPI EEPROM Commands
#define WREN_CMD  0x06
#define WRDI_CMD  0x04
#define RDSR_CMD  0x05
#define WRSR_CMD  0x01
#define READ_CMD  0x03
#define WRITE_CMD 0x02

// SPI EEPROM Status reg bits definitions
#define WPEN_STATUS_REG (1<<7)
#define BL1_STATUS_REG  (1<<3)
#define BL0_STATUS_REG  (1<<2)
#define WEL_STATUS_REG  (1<<1)
#define WIP_STATUS_REG  (1<<0)

/*************************************************************************
 * Function Name: SPI0_Init
 * Parameters: none
 * Return: none
 *
 * Description: Init SPI0 block
 *
 *************************************************************************/
void SPI0_Init (void)
{
  // Enable PIO0 blocks for SPI I/O configuration
  PIO0_ECR = 1;
  // Disable PIO function for SPI0 signals - MISO0, MOSI0 and SPCK0
  // (P0.16, P0.17 and P0.18)
  PIO0_PDR = (1UL << 16) | (1UL << 17) | (1UL << 18);
  // Enable PIO NSS0 (P0.15)
  PIO0_PER = 1UL<<15;
  // Enable P0.15 output
  PIO0_OER  = 1UL<<15;
  // Set P0.15 to high
  PIO0_SODR = 1UL<<15;
  // SPI0 init
  // Enable SPI0 block
  SPI0_ECR = (1UL << 31) | (1UL << 1);
  // software reset
  SPI0_CR = 1;
  SPI0_MR_bit.MSTR   = 1;  // Master mode
  SPI0_CSR = 1UL << 6;     // Clear end of transfer flag
  SPI0_SSR_bit.CPOL  = 0;
  SPI0_SSR_bit.NCPHA = 1;
  SPI0_SSR_bit.BITS  = 8;  // 8 bits
  SPI0_SSR_bit.SCBR  = 10; // 1MHz
  // Enable SPI0
  SPI0_CR = 1 << 1;
}

/*************************************************************************
 * Function Name: SPI0_TransferByte
 * Parameters: Int8U Data
 * Return: Int8U
 *
 * Description: SPI0 transfer byte
 *
 *************************************************************************/
Int8U SPI0_TransferByte (Int8U Data)
{
  SPI0_TDR = Data;
  // wait end of transfer
  while(!SPI0_SR_bit.ENDTRANS);
  // Clear end of transfer flag
  SPI0_CSR = 1UL << 6;
  return(SPI0_RDR);
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_GetStatusReg
 * Parameters: none
 * Return: Int8U
 *
 * Description: Get EEPROM status register
 *
 *************************************************************************/
Int8U SPI0_EEPROM_GetStatusReg (void)
{
Int8U Data;
  CS_L();
  SPI0_TransferByte(RDSR_CMD);
  Data = SPI0_TransferByte(0);
  CS_H();
  return(Data);
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_SetStatusReg
 * Parameters: Data
 * Return: none
 *
 * Description: Set EEPROM status register
 *
 *************************************************************************/
void SPI0_EEPROM_SetStatusReg (Int8U Data)
{
  CS_L();
  SPI0_TransferByte(WRSR_CMD);
  SPI0_TransferByte(Data);
  CS_H();
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_WriteEnable
 * Parameters: none
 * Return: none
 *
 * Description: Write enable
 *
 *************************************************************************/
void SPI0_EEPROM_WriteEnable (void)
{
  CS_L();
  SPI0_TransferByte(WREN_CMD);
  CS_H();
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_WriteDisable
 * Parameters: none
 * Return: none
 *
 * Description: Write disable
 *
 *************************************************************************/
void SPI0_EEPROM_WriteDisable (void)
{
  CS_L();
  SPI0_TransferByte(WRDI_CMD);
  CS_H();
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_ByteWrire
 * Parameters: Int32U Addr, Int8U Data
 * Return: none
 *
 * Description: Write byte to SPI0 EEPROM
 *
 *************************************************************************/
void SPI0_EEPROM_ByteWrire ( Int32U Addr, Int8U Data)
{
  // Write Enable Latch
  SPI0_EEPROM_WriteEnable();

  CS_L();
  SPI0_TransferByte(WRITE_CMD);
  SPI0_TransferByte(Addr>>8);
  SPI0_TransferByte(Addr);
  SPI0_TransferByte(Data);
  CS_H();

  while(SPI0_EEPROM_GetStatusReg() & WIP_STATUS_REG);
}

/*************************************************************************
 * Function Name: SPI0_EEPROM_ByteRead
 * Parameters: Int32U Addr, Int8U * pData
 * Return: none
 *
 * Description: Read byte from SPI0 EEPROM
 *
 *************************************************************************/
void SPI0_EEPROM_ByteRead (Int32U Addr, Int8U * pData)
{
  CS_L();
  SPI0_TransferByte(READ_CMD);
  SPI0_TransferByte(Addr>>8);
  SPI0_TransferByte(Addr);
  *pData = SPI0_TransferByte(0x0);
  CS_H();
}

/*************************************************************************
 * Function Name: main
 * Parameters: none
 * Return: none
 *
 * Description: Main
 *
 *************************************************************************/
void main (void)
{

  SPI0_Init();

  // Write Data
  for(Int32U i = 0; i < 20; i++)
  {
    SPI0_EEPROM_ByteWrire(i,i);
  }

  // Read data
  for(Int32U i = 0; i < 20; i++)
  {
    Int32U Data;
    SPI0_EEPROM_ByteRead(i,(pInt8U)&Data);
    if(i != Data)
    {
      assert(0);
    }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?