..код выше не работает.
----------------------------------------
код ниже - работает по прерывания:
SPORT_TX - UART
для вывода отладки.
CODE
//----------------------------------------
// SPORT Transmitter buffer
#define TX_BUFFER_SIZE1 512
volatile u8 tx_buffer1[TX_BUFFER_SIZE1];
volatile unsigned int tx_wr_index1=0,
tx_rd_index1=0,tx_counter1=0;
//-------------------------------------------------
void Init_Interrupts(void)
{
// assign core IDs to interrupts
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xfff2ffff;//SPORT1 TX->IVG4
*pSIC_IAR2 = 0xffffffff;
ssync();
// assign ISRs to interrupt vectors
register_handler( ik_ivg9, SPORT1_TX_ISR); //
ssync();
*pSIC_IMASK = (DMA4_IRQ);// DMA4_IRQ - SPORT1_TX_ISR
}
//------------------------------------------------------------
void init_SPORT1 (unsigned int SPORT1_SCLK) //инициализация канала SPORT0
{
short divider;
unsigned int SCLK_VALUE=100000000;//клок системной шины
*pSPORT1_TCR1 = TFSR | ITFS | ITCLK |TLSBIT; /* TSPEN запишем позже! */
*pSPORT1_TCR2 = 10; /* длина передачи минус 1 */
/* Настраиваем регистр приёма, фаза 0 полярность 0
*/
*pSPORT1_RCR1 = RCKFE | RFSR; /* RSPEN запишем позже! */
*pSPORT1_RCR2 = 10; /* 32 - 1; Длина приемника 32 бита - у нас такой АЦП */
/* Расчитаем делитель и запишем его в регистры тактовой частоты приема и передачи */
divider = SCLK_VALUE / (SPORT1_SCLK * 2 - 1);
/* Делитель в оба регистра */
*pSPORT1_TCLKDIV = divider;
*pSPORT1_RCLKDIV = divider;
*pSPORT1_TFSDIV = 0;
}
//------------------------------------------------------------
EX_INTERRUPT_HANDLER(SPORT1_TX_ISR)
{
u16 a=0;
u16 data;
*pDMA4_IRQ_STATUS = DMA_DONE;
FLAG_SPORT1_TX=1;
if (tx_counter1)
{
--tx_counter1;
data = tx_buffer1[tx_rd_index1++];
a = data<<2;
data = (a|(0x01<<10))|0x1;
*pSPORT1_TX16 = data;
if (tx_rd_index1 == TX_BUFFER_SIZE1) tx_rd_index1=0;
}
else
{
*pSIC_IMASK &= ~0x01000;
}
}
//---------------------------------------------------
void SPORT1_enable(void)
{
*pSIC_IMASK |= 0x01000;
ssync();
*pSPORT1_TCR1 |= TSPEN; // Enable SPORT0 Transmitter
ssync();
*pSPORT1_RCR1 |= RSPEN; // Enable SPORT0 Transmitter
ssync();
}
void SPORT1_disable(void)
{
ssync();
*pSPORT1_TCR1 &= ~(TSPEN); // Enable SPORT0 Transmitter
ssync();
*pSPORT1_RCR1 &= ~(RSPEN); // Enable SPORT0 Transmitter
ssync();
}
u32 SPORT1_write (u16 data)
{
volatile u32 word;
u16 a=0;
int temp_IMASK; //Anomali err
a = data<<2;
data = (a|(0x01<<10))|0x1;
SPORT1_enable();
//while(!(*pSPORT1_STAT & TXHRE));
*pSPORT1_TX16 = data;
return word;
}
void put_char1(char c)
{
// while (tx_counter1 == TX_BUFFER_SIZE1);
*pSIC_IMASK &= ~0x01000;//запрещаем прерывание на передачу
ssync();
if (tx_counter1||((*pSPORT1_STAT & TXF))) //если буфер не пустой или FIFO забит
{
tx_buffer1[tx_wr_index1++]=c;
if (tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0;
++tx_counter1;
ssync();
*pSIC_IMASK |= 0x01000;//разрешаем прерывание на передачу
ssync();
}
else
{
SPORT1_write ©;
}
}
void put_str1(char *s)
{
while (*s != 0)
put_char1(*s++);
}
int main(void)
{
init_SPORT1 (256000)//инициализация канала SPORT1 256000 бит/с
Init_Interrupts();
put_str1("Hellow world!\r\n");
}