Update CCS12 peripheral firmware and documentation
This commit is contained in:
@@ -1,3 +1,12 @@
|
||||
/**
|
||||
* @file spise2p.c
|
||||
* @brief Неблокирующий драйвер последовательной EEPROM поверх SPI.
|
||||
*
|
||||
* Высокоуровневые Seeprom_read/Seeprom_write запускают транзакцию, а конечный
|
||||
* автомат SPISE2P_DRV_tick продвигается от Timer2. Состояние драйвера единично:
|
||||
* новую операцию разрешено начинать только после spiSe2pFree(). Адрес и длина
|
||||
* должны укладываться в SEEPROM_LEN и не пересекать ограничения микросхемы.
|
||||
*/
|
||||
/*=================================================================
|
||||
File name : SPISE2PD.C
|
||||
|
||||
@@ -32,6 +41,14 @@ int ccc=0;
|
||||
/******* SPI bus Serial EEPROM driver Initialization routine ********/
|
||||
/********************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Синхронно записывает пользовательский блок через асинхронный драйвер.
|
||||
* @param adres Начальный адрес EEPROM.
|
||||
* @param buf Источник данных в памяти DSP.
|
||||
* @param size Размер блока в байтах.
|
||||
* @details Ожидает освобождения драйвера, запускает транзакцию и блокируется до
|
||||
* её завершения, которое продвигается прерываниями Timer2.
|
||||
*/
|
||||
void Seeprom_write( unsigned int adres,
|
||||
unsigned int buf[],
|
||||
unsigned int size)
|
||||
@@ -63,6 +80,12 @@ void Seeprom_write( unsigned int adres,
|
||||
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Синхронно читает блок EEPROM в пользовательский буфер.
|
||||
* @param adres Начальный адрес EEPROM.
|
||||
* @param buf Приёмный буфер DSP.
|
||||
* @param size Размер в байтах.
|
||||
*/
|
||||
void Seeprom_read( unsigned int adres,
|
||||
unsigned int buf[],
|
||||
unsigned int size)
|
||||
@@ -94,6 +117,10 @@ void Seeprom_read( unsigned int adres,
|
||||
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Инициализирует SPI, объект драйвера и периодический Timer2.
|
||||
* @post se2p находится в свободном состоянии, Timer2 вызывает cpu_timer2_isr().
|
||||
*/
|
||||
void InitSeeprom()
|
||||
{
|
||||
se2p.init(&se2p);
|
||||
@@ -108,6 +135,7 @@ void InitSeeprom()
|
||||
IER |= M_INT14;
|
||||
}
|
||||
|
||||
/** @brief Сбрасывает конечный автомат и программирует регистры SPI-A. */
|
||||
void SPISE2P_DRV_init(SPISE2P_DRV *eeprom)
|
||||
{
|
||||
/* Configure SPI-A pins using GPIO regs*/
|
||||
@@ -141,28 +169,33 @@ void SPISE2P_DRV_init(SPISE2P_DRV *eeprom)
|
||||
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SCI
|
||||
}
|
||||
|
||||
/** @brief Деактивирует chip-select EEPROM. */
|
||||
void SPISE2P_DRV_csset()
|
||||
{
|
||||
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
|
||||
}
|
||||
|
||||
/** @brief Активирует chip-select EEPROM перед транзакцией. */
|
||||
void SPISE2P_DRV_csclr()
|
||||
{
|
||||
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
|
||||
}
|
||||
|
||||
/** @brief Возвращает ненулевое значение, если конечный автомат не занят. */
|
||||
unsigned int spiSe2pFree(SPISE2P_DRV *se2p)
|
||||
{
|
||||
if(se2p->csr&0x3) return(0);
|
||||
else return(1);
|
||||
}
|
||||
|
||||
/** @brief Привязывает описание блока и переводит автомат в начало записи. */
|
||||
void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
|
||||
{
|
||||
se2p->msgPtr=msgPtr;
|
||||
se2p->csr|=0x1;
|
||||
}
|
||||
|
||||
/** @brief Привязывает описание блока и переводит автомат в начало чтения. */
|
||||
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
|
||||
{
|
||||
se2p->msgPtr=msgPtr;
|
||||
@@ -173,6 +206,10 @@ void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
|
||||
/******* SPI bus Serial EEPROM driver Tick function *****************/
|
||||
/********************************************************************/
|
||||
|
||||
/**
|
||||
* @brief ISR Timer2, задающий такт конечному автомату EEPROM.
|
||||
* @note Один вызов выполняет только ограниченный шаг SPI-транзакции.
|
||||
*/
|
||||
interrupt void cpu_timer2_isr(void)
|
||||
{ EALLOW;
|
||||
CpuTimer2.InterruptCount++;
|
||||
@@ -183,6 +220,12 @@ interrupt void cpu_timer2_isr(void)
|
||||
EDIS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Выполняет один переход конечного автомата SPI EEPROM.
|
||||
* @details Состояния последовательно выдают opcode, адрес и данные, ожидают
|
||||
* флаги SPI, управляют CS и проверяют готовность микросхемы после записи.
|
||||
* @param eeprom Активный экземпляр драйвера с описанием текущего блока.
|
||||
*/
|
||||
void SPISE2P_DRV_tick(SPISE2P_DRV *eeprom)
|
||||
{
|
||||
static unsigned int step=0;
|
||||
|
||||
Reference in New Issue
Block a user