161 lines
6.2 KiB
C
161 lines
6.2 KiB
C
/**
|
||
* @file spise2p.h
|
||
* @brief Конфигурация SPI EEPROM и структуры её конечного автомата.
|
||
*
|
||
* Определяет команды микросхемы, ширину адреса/данных, скорость SPI и состояния
|
||
* транзакции. SPISE2P_DRV_DEFAULTS создаёт единственный драйвер с callback-функциями;
|
||
* перед чтением или записью требуется InitSeeprom(), а диапазон операции должен
|
||
* оставаться внутри SEEPROM_LEN.
|
||
*/
|
||
/*=====================================================================
|
||
File name : SPISE2P.H
|
||
|
||
Originator : Settu Duraisamy
|
||
C2000 Applications Team
|
||
Texas Instruments
|
||
|
||
Description :
|
||
Header file containing object definitions, proto type
|
||
declaration and default object initializers for
|
||
SPI Serial EEPROM driver using VSPI
|
||
|
||
Date : 30/6/2003 (DD/MM/YYYY)
|
||
=======================================================================*/
|
||
|
||
#ifndef __SPISE2P_H__
|
||
|
||
#define __SPISE2P_H__
|
||
|
||
// Ёмкость памати в байтах
|
||
#define SEEPROM_LEN 0x10000
|
||
|
||
#define NULL 0
|
||
|
||
#define SIXTEEN_BIT 15
|
||
#define EIGHT_BIT 07
|
||
|
||
/***************************************************************/
|
||
/* Configurable Parameter for SPI bus Serial EEPROM */
|
||
/***************************************************************/
|
||
#define SPISE2P_DATA_WIDTH SIXTEEN_BIT//EIGHT_BIT
|
||
#define SPISE2P_ADDR_WIDTH SIXTEEN_BIT
|
||
#define SPIBAUD_REG_VAL 1//12
|
||
#define SPICLK_PHASE 1
|
||
#define SPICLK_POLARITY 0
|
||
|
||
#define SPIBAUD_RATE 100000
|
||
//10000000
|
||
|
||
/**************************************************************/
|
||
/**************************************************************/
|
||
|
||
/* Serial EEPROM Command words, left justified */
|
||
#define SPISE2P_READ_CMD 0x0300
|
||
#define SPISE2P_WRITE_CMD 0x0200
|
||
#define SPISE2P_WRDI_CMD 0x0400
|
||
#define SPISE2P_WREN_CMD 0x0600
|
||
#define SPISE2P_RDSR_CMD 0x0500
|
||
#define SPISE2P_WRSR_CMD 0x0100
|
||
|
||
#define SPISE2P_RDID_CMD 0x0A00
|
||
|
||
#define SPISE2P_DUMMY_DATA 0x0000
|
||
#define SPISE2P_BUSY_MASK 0x01
|
||
|
||
/* Symbolic constant for SPICCR to transfer 8bit or 16 bit value*/
|
||
#define SPISE2P_TFR16BIT 0x80|(SPICLK_POLARITY<<6)|SIXTEEN_BIT
|
||
#define SPISE2P_TFR8BIT 0x80|(SPICLK_POLARITY<<6)|EIGHT_BIT
|
||
|
||
/* Status valus */
|
||
#define SPISE2P_WRRQ 1 /* Write Requset */
|
||
#define SPISE2P_RDRQ 2 /* Read request */
|
||
#define SPISE2P_WRIP 4 /* Write in progress */
|
||
#define SPISE2P_RDIP 8 /* Read in progress */
|
||
|
||
/* Message declaration */
|
||
typedef struct {
|
||
unsigned int *dataPtr; /* Data pointer */
|
||
unsigned long nrData; /* number of data */
|
||
unsigned long se2pAddr; /* se2pAddr */
|
||
}SE2P_DATA;
|
||
|
||
|
||
/* Object declaration */
|
||
typedef struct {
|
||
SE2P_DATA *msgPtr;
|
||
unsigned int csr; /* control/status register */
|
||
void (*init)(void *);
|
||
void (*tick)(void *);
|
||
void (*csset)(void);
|
||
void (*csclr)(void);
|
||
}SPISE2P_DRV;
|
||
|
||
#define SPISE2P_DRV_DEFAULTS { NULL,\
|
||
0,\
|
||
(void (*)(void *))SPISE2P_DRV_init,\
|
||
(void (*)(void *))SPISE2P_DRV_tick,\
|
||
(void (*)(void))SPISE2P_DRV_csset,\
|
||
(void (*)(void))SPISE2P_DRV_csclr}
|
||
|
||
typedef SPISE2P_DRV *SPISE2P_DRV_handle;
|
||
|
||
/** Сбрасывает поля конечного автомата и конфигурирует SPI. */
|
||
void SPISE2P_DRV_init(SPISE2P_DRV * );
|
||
/** Продвигает конечный автомат EEPROM на один таймерный такт. */
|
||
void SPISE2P_DRV_tick(SPISE2P_DRV *);
|
||
/** Деактивирует аппаратный chip-select EEPROM. */
|
||
void SPISE2P_DRV_csset(void);
|
||
/** Активирует аппаратный chip-select EEPROM. */
|
||
void SPISE2P_DRV_csclr(void);
|
||
|
||
/** @return Ненулевое значение, когда драйвер готов принять новую операцию. */
|
||
unsigned int spiSe2pFree(SPISE2P_DRV *se2p);
|
||
/**
|
||
* Запускает асинхронную запись.
|
||
* @param se2p Экземпляр конечного автомата.
|
||
* @param msgPtr Описание адреса, буфера и длины блока.
|
||
*/
|
||
void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *data);
|
||
/**
|
||
* Запускает асинхронное чтение.
|
||
* @param se2p Экземпляр конечного автомата.
|
||
* @param msgPtr Описание адреса, буфера и длины блока.
|
||
*/
|
||
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *data);
|
||
|
||
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
|
||
#define PROM_LEN 0x8000
|
||
#define PAGE_LEN 0x20
|
||
#define WORD_LEN 2
|
||
#else
|
||
#define PROM_LEN 0x4000
|
||
#define PAGE_LEN 0x40
|
||
#define WORD_LEN 1
|
||
#endif
|
||
|
||
/* Установка драйвера сериальной EEPROM. **
|
||
** Инициализациа SPI и проч. Также настройка таймера. **
|
||
** Драйвер работает на прерываниах от таймера 2! */
|
||
void InitSeeprom(void);
|
||
|
||
/* Запись блока в SEEPROM. Параметры таковы: **
|
||
** adres - адрес в епромке, куда писать. **
|
||
** adres = 0..0x8000, если длина слова 8 бит **
|
||
** adres = 0..0x4000, если длина слова 16 бит **
|
||
** buf - указатель на памать, откуда писать. **
|
||
** size - длина блока в байтах. По-любому в байтах! */
|
||
/** @param size Размер блока в байтах, независимо от SPISE2P_DATA_WIDTH. */
|
||
void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int size);
|
||
|
||
/* Чтение блока из SEEPROM. Параметры таковы: **
|
||
** adres - адрес в епромке, откуда читать. **
|
||
** adres = 0..0x8000, если длина слова 8 бит **
|
||
** adres = 0..0x4000, если длина слова 16 бит **
|
||
** buf - указатель на памать, куда читать. **
|
||
** size - длина блока в байтах. По-любому в байтах! */
|
||
/** @param size Размер блока в байтах, независимо от SPISE2P_DATA_WIDTH. */
|
||
void Seeprom_read(unsigned int adres, unsigned int buf[], unsigned int size);
|
||
|
||
#endif
|
||
|