Initialize.c
#include <cdefbf533.h>
#include <signal.h>
#include <stdio.h>
#include <sys/exception.h>
#include <sys/excause.h>
#include "BF.h"
#include "Talkthrough.h"
char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! BlackFIN module UART works\n\r"
"Please enter a few symbols and echo it - \n\r"} ;
char testik[] = {"U2RT"} ;
//--------------------------------------------------------------------------//
// Function: Init_EBIU
// процедура_инициализации_интерфейса_внешней_шины
// --- функция_осуществляет_инициализацию и разрешает работу асинхронных_
// --- банков_флеш_памяти А
//--------------------------------------------------------------------------//
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}
//--------------------------------------------------------------------------//
// Function: Init_Flash
// инициализация_порта_ввода вывода флеш памяти.
// первый_вывод_порта_А сконфигурирован как выход и исспользуется для сброса
// кодека
//--------------------------------------------------------------------------//
void Init_Flash(void)
{
*pFlashA_PortA_Dir = 0x1;
}
//--------------------------------------------------------------------------//
// Function: Init1836()
// данная_функция осуществляет конфигурацию аудиокодека AD1836 посредством
// интерфейса управления SPI
// содержимое_массива sCodec1836TxRegs загружается в конфигурационные регистры
// кодека
//--------------------------------------------------------------------------//
void Init1836(void)
{
int i;
int j;
static unsigned char ucActive_LED = 0x01;
// write to Port A to reset AD1836
*pFlashA_PortA_Data = 0x00;
// write to Port A to enable AD1836
*pFlashA_PortA_Data = ucActive_LED;
// wait to recover from reset
for (i=0; i<0xf0000; i++) asm("nop;");
// Enable PF4
*pSPI_FLG = FLS4;
// Set baud rate SCK = HCLK/(2*SPIBAUD) SCK = 2MHz
*pSPI_BAUD = 16;
// configure spi port
// SPI DMA write, 16-bit data, MSB first, SPI Master
*pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR;
// Set up DMA5 to transmit
// Map DMA5 to SPI
*pDMA5_PERIPHERAL_MAP = 0x5000;
// Configure DMA5
// 16-bit transfers
*pDMA5_CONFIG = WDSIZE_16;
// Start address of data buffer
*pDMA5_START_ADDR = (void *)sCodec1836TxRegs;
// DMA inner loop count
*pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH;
// Inner loop address increment
*pDMA5_X_MODIFY = 2;
// enable DMAs
*pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN);
// enable spi
*pSPI_CTL = (*pSPI_CTL | SPE);
// wait until dma transfers for spi are finished
for (j=0; j<0xaff0; j++) asm("nop;");
// disable spi
*pSPI_CTL = 0x0000;
}
//--------------------------------------------------------------------------//
// Function: Init_Sport0
// Description: Configure Sport0 for I2S mode, to transmit/receive data //
// to/from the AD1836. Configure Sport for external clocks and //
// frame syncs. //
//--------------------------------------------------------------------------//
void Init_Sport0(void)
{
// Sport0 receive configuration
// External CLK, External Frame sync, MSB first, Active Low
// 24-bit data, Stereo frame sync enable
*pSPORT0_RCR1 = RFSR | RCKFE;
*pSPORT0_RCR2 = SLEN_24 | RXSE | RSFSE;
// Sport0 transmit configuration
// External CLK, External Frame sync, MSB first, Active Low
// 24-bit data, Secondary side enable, Stereo frame sync enable
*pSPORT0_TCR1 = TFSR | TCKFE;
*pSPORT0_TCR2 = SLEN_24 | TXSE | TSFSE;
}
//--------------------------------------------------------------------------//
// Function: Init_DMA
// Description: Initialize DMA1 in autobuffer mode to receive and DMA2 in //
//autobuffer mode to transmit //
//------------------------------------------------------------------//
void Init_DMA(void)
{
// Set up DMA1 to receive
// Map DMA1 to Sport0 RX
*pDMA1_PERIPHERAL_MAP = 0x1000;
// Configure DMA1
// 32-bit transfers, Interrupt on completion, Autobuffer mode
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1; // --- по каналу DMA1 передаются 16_бит пакеты
// Start address of data buffer
// -------- инициализация_входного_буфера ----------
*pDMA1_START_ADDR = (void *)iRxBuffer1;
// DMA inner loop count
*pDMA1_X_COUNT = Buffer_2xSize; // --- число_отсчетов_в_буфере_приема_сдвух_каналов
// Inner loop address increment
*pDMA1_X_MODIFY = 4;
//*pDMA1_X_MODIFY = Buffer_2xSize;
// -------------------------------------------------
// Set up DMA2 to transmit
// Map DMA2 to Sport0 TX
*pDMA2_PERIPHERAL_MAP = 0x2000;
// Configure DMA2
// 32-bit transfers, Autobuffer mode
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1; // --- по каналу DMA2 передаются 16_бит пакеты
// Start address of data buffer
// -------- инициализация_выходного_буфера ----------
*pDMA2_START_ADDR = (void *)iTxBuffer1;
// DMA inner loop count
*pDMA2_X_COUNT = Buffer_2xSize; // число_отсчетов_в_буфере_передачи_сдвух_каналов
// Inner loop address increment
*pDMA2_X_MODIFY = 4;
//*pDMA2_X_MODIFY = Buffer_2xSize;
// --------------------------------------------------
}
//--------------------------------------------------------------------------//
// Function: Enable_DMA_Sport
// Description: Enable DMA1, DMA2, Sport0 TX and Sport0 RX
//--------------------------------------------------------------------------//
void Enable_DMA_Sport0(void)
{
// enable DMAs
*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN);
*pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN);
// enable Sport0 TX and RX
*pSPORT0_TCR1 = (*pSPORT0_TCR1 | TSPEN);
*pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN);
}
//--------------------------------------------------------------------------//
// Function: Init_Interrupts
// Description: Initialize Interrupt for Sport0 RX //
//--------------------------------------------------------------------------//
//----- функция инициализации прерываний процессора --------------
void Init_Interrupts(void)
{
// assign core IDs to interrupts
// Set Sport0 RX (DMA1) interrupt priority to 2 = IVG9
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffff2f;
*pSIC_IAR2 = 0xffff5fff;// FlagA -> ID5
// assign ISRs to interrupt vectors
// Sport0 RX ISR -> IVG 9
register_handler(ik_ivg9, Sport0_RX_ISR);
#ifdef KEY_СONTROL
register_handler(ik_ivg12, FlagA_ISR); // FlagA ISR -> IVG 12
#endif KEY_СONTROL
// enable Sport0 RX interrupt
*pSIC_IMASK = 0x00080200;
}
#ifdef KEY_СONTROL
//--------------------------------------------------------------------------//
// Function: Init_Flags
// Description: Initialize Flags for Key Controle //
//--------------------------------------------------------------------------//
void Init_Flags(void)
{
*pFIO_INEN = 0x0700 ; // разрешение буфферизации флага 8,9,10
*pFIO_DIR = 0x0000 ; // все флаги входные
*pFIO_EDGE = 0x0700 ; // флаг 8,9,10 демаскує переривання, спрацьовує по рівню
*pFIO_MASKA_D = 0x0700 ; // демаскирование прерываний по 8,9,10 флагу
}
#endif // KEY_СONTROL
//--------------------------------------------------------------------------//
// Function: Init_Uart //
// Description: Initialize Uart //
//--------------------------------------------------------------------------//
void Init_Uart()
{
unsigned long divisor ; // --- значение делителя DIVIsOR ---
unsigned char msel ; // --- значение коефф. умножения MSEL[5:0]
// --- регистра PLL_CTL[14:9] ---
unsigned char ssel ; // --- делитель тактового сигнала системы SSEL[3:0]
// --- of PLL_DIV register[3:0]
/* Line Control Setup */
*pUART_LCR = 0x0083; // Регістр керування лінією зв'язку
// --- при разрыве соединения TX переводится в 0
// --- 8-ми битные данные, 1 стоповый бит,
// --- бит проверки не передается и не проверяется.
/* Чтение значения множителя MSEL в регистре PLL_CTL */
// --- чтение осуществляется сдвигом вправо на девять бит --- //
msel = (*pPLL_CTL)>>9 ; // Read MSEL[5:0] from PLL_CTL
msel &= 0x3F ; // Clear all bits except msel[5:0]
// --- msel после сброса равно 10 DEC -------------------------
/* Read SSEL from PLL_DIV register */
ssel = *pPLL_DIV ; // --- чтение делителя тактового сигнала системы ---
ssel &= 0x0F ; // --- присваивание с поразрядной операцией И
// --- Clear all bits except ssel[3:0]
// --- ssel после сброса равен 5 DEC ----------------------------
/* divisor calculation:
* SCLK = (msel * CLKIN)/ssel if DF = 0 // --- формула по расчету частоты периферии
* SCLK = (msel * CLKIN/2)/ssel if DF = 1
* divisor = SCLK/(16 * BAUD_RATE)
*/
divisor = ((msel * CLKIN)/(ssel * 16 * BAUD_RATE)); // --- 29 ----
if(*pPLL_CTL & 0x1) // If DF = 1, CLKIN/2 is going to PLL
{
divisor /= 2; // Divide by 2
}
/* Baud Rate Setup: 115.2 Kbps */
// --- разрешение доступа к регистрам UART_DLL и UART_DLH ----
//Регістр молодшого і старшого байта дільника
// --- присваивание с поразрядной операцией ИЛИ --------------
*pUART_LCR |= DLAB; // Enable Divisor Latch Access
*pUART_DLL = divisor; // молодший байт дільника
ssync();
*pUART_DLH = (divisor>>8); // страший байт дільника
ssync();
// --- Доступ к буферным регистрам приема и передачи ----------
// --- изменение 1 на 0 ---------------------------------------
*pUART_LCR &= ~DLAB;// Disable Divisor Latch Access
ssync();
//Регістр глобального керування UART
//Дозвіл тактової синхронізації UART
*pUART_GCTL = UCEN; /*UART Clock enable*/
ssync();
// --- вывод гостевого приглашения в терминальную программу ---
char temp ;
int Size ;
int i ;
Size = sizeof(welcomemessage) ;
for ( i=0 ; i<Size ; i++)
{
// ждать готовность передатчика
do {;}
//Регістр стану ліннії
while (!(*pUART_LSR & TEMT)) ; // пока сдвиговый и буферн. регистры заполнены.
*pUART_THR = welcomemessage[i] ;
}
ssync();
//ssync();
// --- разрешение прерывания по заполнению буфера приема ------
//Регістр дозволу переривань
*pUART_IER =0x1;//Enable interrupts for receive
// ------------------------------------------------------------
ssync();
//ssync();
// -------------------------------------------------------------------------------------------------------
*pSIC_IAR0 = 0xffffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // назначение ID 3 для приема данных по UART
*pSIC_IAR2 = 0xffffffff ;
ssync();
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10
*pSIC_IMASK = 0x00004000;
ssync();
}