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 + -
显示快捷键?