Files
Balsam_167/Source/Internal/spise2p.c
Andrey f741741cf8 Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
2026-10-12 12:24:48 +03:00

782 lines
58 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Instance the SPI bus serial EEPROM driver */
/* Объявляет se2p — данные se2p; SPISE2P_DRV_DEFAULTS — данные SPISE2P_DRV_DEFAULTS. Начальное значение задаётся справа от знака равенства. */
static SPISE2P_DRV se2p=SPISE2P_DRV_DEFAULTS;
/* Instance serial EEPROm data transfer structure */
/* Продолжает список аргументов, полей или выражение static SE2P_DATA writeData, readData;; порядок элементов сохраняется. */
static SE2P_DATA writeData, readData;
// Prototype statements for functions found within this file.
/* Объявляет интерфейс функции PRD_TICK; реализация вызывается через этот прототип. */
interrupt void PRD_TICK(void);
/* Продвигает SPI EEPROM по Timer2 и подтверждает прерывание таймера. */
interrupt void cpu_timer2_isr(void);
/* Объявляет ccc — данные ccc. Начальное значение задаётся справа от знака равенства. */
int ccc=0;
/********************************************************************/
/******* SPI bus Serial EEPROM driver Initialization routine ********/
/********************************************************************/
/* Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
void Seeprom_write( SE2P_SIZE adres,
/* Объявляет buf — данные buf. */
unsigned int buf[],
/* Объявляет size). */
SE2P_SIZE size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет len — данные len. */
unsigned int len;
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
/* Проверяет if (adres >= PROM_LEN или !size или size > (PROM_LEN-adres)*2) return; последующий оператор выполняется только при истинном условии. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает CpuTimer2.InterruptCount значением 0; прерывание число. */
CpuTimer2.InterruptCount=0;
/* Записывает CpuTimer2Regs.TCR.all значением 0x4020; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Записывает size значением (size / WORD_LEN) + (size % WORD_LEN); размер. */
size = (size / WORD_LEN) + (size % WORD_LEN);
/* Повторяет или ожидает, пока выполняется while(size). */
while(size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает len значением PAGE_LEN - (adres % PAGE_LEN); данные len. */
len = PAGE_LEN - (adres % PAGE_LEN);
/* Проверяет if(len > size) len=size; последующий оператор выполняется только при истинном условии. */
if(len > size) len=size;
/* Записывает writeData.dataPtr значением buf; данные Ptr. */
writeData.dataPtr = buf;
/* Записывает writeData.nrData значением len; nr данные. */
writeData.nrData = len;
/* Записывает writeData.se2pAddr значением adres * WORD_LEN; данные se2pAddr. */
writeData.se2pAddr = adres * WORD_LEN;
/* Вызывает spiSe2pWrite. Ставит задание записи в SPI-драйвер с учётом состояния занятости EEPROM. */
spiSe2pWrite(&se2p, &writeData);
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Увеличивает buf значением len; данные buf. */
buf += len;
/* Увеличивает adres значением len; данные adres. */
adres += len;
/* Уменьшает size значением len; размер. */
size -= len;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает CpuTimer2Regs.TCR.all значением 0x4010; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
void Seeprom_read( SE2P_SIZE adres,
/* Объявляет buf — данные buf. */
unsigned int buf[],
/* Объявляет size). */
SE2P_SIZE size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет len — данные len. */
unsigned int len;
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
/* Проверяет if (adres >= PROM_LEN или !size или size > (PROM_LEN-adres)*2) return; последующий оператор выполняется только при истинном условии. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает CpuTimer2.InterruptCount значением 0; прерывание число. */
CpuTimer2.InterruptCount=0;
/* Записывает CpuTimer2Regs.TCR.all значением 0x4020; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Записывает size значением (size / WORD_LEN) + (size % WORD_LEN); размер. */
size = (size / WORD_LEN) + (size % WORD_LEN);
/* Повторяет или ожидает, пока выполняется while(size). */
while(size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает len значением PAGE_LEN - (adres % PAGE_LEN); данные len. */
len = PAGE_LEN - (adres % PAGE_LEN);
/* Проверяет if(len > size) len=size; последующий оператор выполняется только при истинном условии. */
if(len > size) len=size;
/* Записывает readData.dataPtr значением buf; данные Ptr. */
readData.dataPtr = buf;
/* Записывает readData.nrData значением len; nr данные. */
readData.nrData = len;
/* Записывает readData.se2pAddr значением adres * WORD_LEN; данные se2pAddr. */
readData.se2pAddr = adres * WORD_LEN;
/* Вызывает spiSe2pRead. Ставит задание чтения в SPI-драйвер с указателем буфера, длиной и физическим адресом. */
spiSe2pRead(&se2p, &readData);
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Увеличивает buf значением len; данные buf. */
buf += len;
/* Увеличивает adres значением len; данные adres. */
adres += len;
/* Уменьшает size значением len; размер. */
size -= len;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает CpuTimer2Regs.TCR.all значением 0x4010; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию InitSeeprom; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void InitSeeprom()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение se2p.init(&se2p);; порядок элементов сохраняется. */
se2p.init(&se2p);
/* Разрешение записи в защищённые регистры периферии. */
EALLOW; // This is needed to write to EALLOW protected registers
/* Записывает PieVectTable.TINT2 значением &cpu_timer2_isr; данные TINT2. */
PieVectTable.TINT2 = &cpu_timer2_isr;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS; // This is needed to disable write to EALLOW protected registers
/* Инициализирует модуль вызовом InitCpuTimers(); перед его дальнейшим использованием. */
InitCpuTimers(); // For this example, only initialize the Cpu Timers
/* Вызывает ConfigCpuTimer с аргументами (&CpuTimer2, (SYSCLKOUT/1000000), 100) в текущей последовательности операций. */
ConfigCpuTimer(&CpuTimer2, (SYSCLKOUT/1000000), 100);
/* Устанавливает биты IER значением M_INT14; регистр разрешения прерываний ядра C28x. */
IER |= M_INT14;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_init; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_init(SPISE2P_DRV *eeprom)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Configure SPI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SPI functional pins.
// Comment out other unwanted lines.
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO16 значением 1; аппаратная линия ввода/вывода GPIO16. */
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO17 значением 1; аппаратная линия ввода/вывода GPIO17. */
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO18 значением 1; аппаратная линия ввода/вывода GPIO18. */
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; // General purpose I/O 19 (default) (I/O)
/* Записывает GpioCtrlRegs.GPADIR.bit.GPIO19 значением 1; аппаратная линия ввода/вывода GPIO19. */
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // Configures the GPIO pin as an output
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Configure the SPI: 8-bit, Rising edge with delay */
/* Записывает SpiaRegs.SPICCR.all значением 0x0007; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=0x0007;
/* Записывает SpiaRegs.SPICTL.all значением 0x001F; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICTL.all=0x001F;
/* Записывает SpiaRegs.SPISTS.all значением 0x00; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPISTS.all=0x00;
/* Записывает SpiaRegs.SPIBRR значением CLKMULT * 6 + 1; данные SPIBRR. */
SpiaRegs.SPIBRR = CLKMULT * 6 + 1;
/* Записывает SpiaRegs.SPIFFTX.all значением 0x8000; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFTX.all=0x8000;
/* Записывает SpiaRegs.SPIFFRX.all значением 0x0000; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFRX.all=0x0000;
/* Записывает SpiaRegs.SPIFFCT.all значением 0x00; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFCT.all=0x00;
/* Записывает SpiaRegs.SPIPRI.all значением 0x0010; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIPRI.all=0x0010;
/* Disable Chip Select of Serial EEPROM */
/* Записывает eeprom->csr значением 0; данные eeprom->csr. */
eeprom->csr=0;
/* Записывает eeprom->msgPtr значением 0; данные eeprom->msgPtr. */
eeprom->msgPtr=0;
/* Записывает SpiaRegs.SPICCR.bit.SPISWRESET значением 1; данные SPISWRESET. */
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SCI
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_csset; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_csset()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 1; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_csclr; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_csclr()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет завершение текущего задания SPI EEPROM перед постановкой следующего. */
unsigned int spiSe2pFree(SPISE2P_DRV *se2p)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(se2p->csr&0x3) return(0); последующий оператор выполняется только при истинном условии. */
if(se2p->csr&0x3) return(0);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else return(1);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Ставит задание записи в SPI-драйвер с учётом состояния занятости EEPROM. */
void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает se2p->msgPtr значением msgPtr; данные se2p->msgPtr. */
se2p->msgPtr=msgPtr;
/* Устанавливает биты se2p->csr значением 0x1; данные se2p->csr. */
se2p->csr|=0x1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Ставит задание чтения в SPI-драйвер с указателем буфера, длиной и физическим адресом. */
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает se2p->msgPtr значением msgPtr; данные se2p->msgPtr. */
se2p->msgPtr=msgPtr;
/* Устанавливает биты se2p->csr значением 0x2; данные se2p->csr. */
se2p->csr|=0x2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/********************************************************************/
/******* SPI bus Serial EEPROM driver Tick function *****************/
/********************************************************************/
/* Продвигает SPI EEPROM по Timer2 и подтверждает прерывание таймера. */
interrupt void cpu_timer2_isr(void)
/* Продолжает список аргументов, полей или выражение { EALLOW;; порядок элементов сохраняется. */
{ EALLOW;
/* Изменяет счётчик в выражении CpuTimer2.InterruptCount++; на один для следующего шага. */
CpuTimer2.InterruptCount++;
/* Продолжает список аргументов, полей или выражение se2p.tick(&se2p);; порядок элементов сохраняется. */
se2p.tick(&se2p);
// The CPU acknowledges the interrupt.
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Продвигает неблокирующий автомат SPI EEPROM: команда, адрес, данные и ожидание завершения записи. */
void SPISE2P_DRV_tick(SPISE2P_DRV *eeprom)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет step — данные step. Начальное значение задаётся справа от знака равенства. */
static unsigned int step=0;
/* Объявляет dataCount — данные число. Начальное значение задаётся справа от знака равенства. */
static unsigned int dataCount=0;
/* Объявляет dummy — данные dummy. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
static volatile unsigned int dummy=0;
/* Вызывает switch с аргументами (step) в текущей последовательности операций. */
switch(step)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Ветвь выбора для 0; выполняется при совпадении селектора switch. */
case 0:
/* If write request is SET, then trigger the Write operation
If read request is SET, then trigger the Read operation
If Read request is also not SET, then continue to poll */
/* Проверяет if(eeprom->csr&SPISE2P_WRRQ); последующий оператор выполняется только при истинном условии. */
if(eeprom->csr&SPISE2P_WRRQ)
/* Записывает step значением 1; данные step. */
{ step=1;
eeprom->csr|=SPISE2P_WRIP; /* Set Write in progress*/ /* Устанавливает биты eeprom->csr значением SPISE2P_WRIP; данные eeprom->csr. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(eeprom->csr&SPISE2P_RDRQ); последующий оператор выполняется только при истинном условии. */
if(eeprom->csr&SPISE2P_RDRQ)
/* Записывает step значением 13; данные step. */
{ step=13;
eeprom->csr|=SPISE2P_RDIP; /* Set Read in progress */ /* Устанавливает биты eeprom->csr значением SPISE2P_RDIP; данные eeprom->csr. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 1; выполняется при совпадении селектора switch. */
case 1:
/************************************************************
*********** SPI bus EEPROM Write Starts from here ***********
*************************************************************
Prier to any attempt to write data to SPI serial EEPROM
Write Enable Latch must be set by issuing the WREN command */
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_WREN_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_WREN_CMD;
/* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает step значением 2; данные step. */
step=2;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 2; выполняется при совпадении селектора switch. */
case 2:
/* Wait for VSPI State machine to send the WREN command and
serial EEPROM Chip Select must be brought to HIGH to set
the WREN latch */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Продолжает список аргументов, полей или выражение eeprom->csset();; порядок элементов сохраняется. */
eeprom->csset();
/* Записывает step значением 3; данные step. */
step=3;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 3; выполняется при совпадении селектора switch. */
case 3:
/* Assert CS of Serial EEPROM and send WRITE command */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_WRITE_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_WRITE_CMD;
/* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает step значением 4; данные step. */
step=4;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 4; выполняется при совпадении селектора switch. */
case 4:
/* Wait for VSPI State machine to send the WRITE command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 5; данные step. */
step=5;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 5; выполняется при совпадении селектора switch. */
case 5:
/* Send Address */
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением (unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
/* Записывает step значением 20; данные step. */
step=20;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 20; выполняется при совпадении селектора switch. */
case 20:
/* Проверяет if (!SpiaRegs.SPISTS.bit.INT_FLAG) break; последующий оператор выполняется только при истинном условии. */
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
/* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
dummy=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 6; данные step. */
step=6;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 6; выполняется при совпадении селектора switch. */
case 6:
/* Wait for VSPI State machine to send the Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 7; данные step. */
step=7;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 7; выполняется при совпадении селектора switch. */
case 7:
/* Send Data */
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением *(eeprom->msgPtr->dataPtr+dataCount); данные SPITXBUF. */
SpiaRegs.SPITXBUF=*(eeprom->msgPtr->dataPtr+dataCount);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением *(eeprom->msgPtr->dataPtr+dataCount)<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=*(eeprom->msgPtr->dataPtr+dataCount)<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Изменяет счётчик в выражении dataCount++; на один для следующего шага. */
dataCount++;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 8; данные step. */
step=8;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 8; выполняется при совпадении селектора switch. */
case 8:
/* Wait for VSPI State machine to send the Data.
If all the data are sent, then set the CS pin to HIGH
to program or write the data in EEPROM array */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Проверяет if (dataCount==eeprom->msgPtr->nrData); последующий оператор выполняется только при истинном условии. */
if (dataCount==eeprom->msgPtr->nrData)
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Записывает step значением 9;}; данные step. */
step=9;}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
step=7; /* Write next data */ /* Записывает step значением 7; данные step. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 9; выполняется при совпадении селектора switch. */
case 9:
/* Read the EEPROM status register to check whether the
data sent are indeed programmed to the EEPROM array.
Hence, send RDSR command to EEPROM to read status reg. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_RDSR_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_RDSR_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 10; данные step. */
step=10;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 10; выполняется при совпадении селектора switch. */
case 10:
/* Wait for VSPI State machine to send RDSR command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 11; данные step. */
step=11;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 11; выполняется при совпадении селектора switch. */
case 11:
/* Send dummy Data to read Status reg. */
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 12; данные step. */
step=12;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 12; выполняется при совпадении селектора switch. */
case 12:
/* Wait for VSPI State machine to clock out status reg.
Check, whether the data are written to the EEPROM array,
If written, then reset the WRIP(write in progress) and
WRRQ(Write request bit) and go back to STATE0 */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Проверяет if (SpiaRegs.SPIRXBUF & SPISE2P_BUSY_MASK ); последующий оператор выполняется только при истинном условии. */
if (SpiaRegs.SPIRXBUF & SPISE2P_BUSY_MASK )
/* Записывает step значением 9; данные step. */
step=9;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_WRIP); данные eeprom->csr. */
{ eeprom->csr&=(~SPISE2P_WRIP);
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_WRRQ); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_WRRQ);
/* Записывает step значением 0; данные step. */
step=0;
/* Записывает dataCount значением 0; данные число. */
dataCount=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 13; выполняется при совпадении селектора switch. */
case 13:
/************************************************************
*********** SPI bus EEPROM Read Starts from here ***********
*************************************************************
Send READ Command to SPI bus serail EEPROM */
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_READ_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_READ_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 14; данные step. */
step=14;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 14; выполняется при совпадении селектора switch. */
case 14:
/* Wait for VSPI State machine to send READ command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 15; данные step. */
step=15;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 15; выполняется при совпадении селектора switch. */
case 15:
/* Send Address */
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением (unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
/* Записывает step значением 21; данные step. */
step=21;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 21; выполняется при совпадении селектора switch. */
case 21:
/* Проверяет if (!SpiaRegs.SPISTS.bit.INT_FLAG) break; последующий оператор выполняется только при истинном условии. */
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
/* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
dummy=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 16; данные step. */
step=16;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 16; выполняется при совпадении селектора switch. */
case 16:
/* Wait for VSPI State machine to send Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 17; данные step. */
step=17;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 17; выполняется при совпадении селектора switch. */
case 17:
/* Send Dummy value to clock out data from serial EEPROM */
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 18; данные step. */
step=18;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 18; выполняется при совпадении селектора switch. */
case 18:
/* Wait for VSPI State machine to clk out data from EEPROM */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Продолжает список аргументов, полей или выражение *(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF;; порядок элементов сохраняется. */
*(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Продолжает список аргументов, полей или выражение *(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF&0xFF;; порядок элементов сохраняется. */
*(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF&0xFF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Изменяет счётчик в выражении dataCount++; на один для следующего шага. */
dataCount++;
/* Записывает step значением 19; данные step. */
step=19;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 19; выполняется при совпадении селектора switch. */
case 19:
/* If all the data are read, terminate the read operation by
rising the CS. Then reset the RDIP (Read in progress) bit
and reset the RDRQ(Read request) bit and go back to STATE0 */
/* Проверяет if (dataCount==eeprom->msgPtr->nrData); последующий оператор выполняется только при истинном условии. */
if (dataCount==eeprom->msgPtr->nrData)
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Записывает step значением 0; данные step. */
step=0;
/* Записывает dataCount значением 0; данные число. */
dataCount=0;
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_RDIP); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_RDIP);
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_RDRQ); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_RDRQ);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Записывает step значением 17; данные step. */
step=17;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}