2010-08-02 03:35:45 Can't disable certain RX TDM channel in SPORT TDM mode.
Michail Kurochkin (BELARUS)
Message: 92039
I need select second channel from TDM frame for read. For this aim, I set MRCS0 = 0x2 and MRCS1, MRCS2, MRCS3 are set to null.
bfin_write_SPORT0_MRCS0(0x2);
bfin_write_SPORT0_MRCS1(0);
bfin_write_SPORT0_MRCS2(0);
bfin_write_SPORT0_MRCS3(0);
I read from SPORT_RX all channels from TDM frame. Registers MRCS0, MRCS1, MRCS2, MRCS3 not influence.
However, this success work for transmit data in certain channel (if use registers MTCS0, MTCS1, MTCS2, MTCS3).
Why MRCSx registers not work in TDM mode?
All code for configure SPORT below:
#define TDM_FREQ 1024000 //PCLK frequency HZ
#define TDM_FRAME_SYNC 8000 //Frame synchronize HZ
bfin_write_SPORT_RCR1(0);
bfin_write_SPORT_RCR2(0);
bfin_write_SPORT_TCR1(0);
bfin_write_SPORT_TCR2(0);
bfin_write_SPORT_TCLKDIV(get_sclk() / TDM_FREQ / 2 - 1);
bfin_write_SPORT_RCLKDIV(get_sclk() / TDM_FREQ / 2 - 1);
SSYNC();
bfin_write_SPORT_TFSDIV(TDM_FREQ / TDM_FRAME_SYNC - 1);
bfin_write_SPORT_RFSDIV(TDM_FREQ / TDM_FRAME_SYNC - 1);
SSYNC();
bfin_write_SPORT_TCR1(TFSR | DITFS | ITFS);
bfin_write_SPORT_RCR1(RFSR | DITFS | IRFS);
bfin_write_SPORT_TCR2(0x7); // Set 8bit per channel for transmit
bfin_write_SPORT_RCR2(0x7); // Set 8bit per channel for receive
bfin_write_SPORT_MCMC1(0x0);
bfin_write_SPORT_MCMC2(0x1010);
bfin_write_SPORT_MRCS0(0x2); //Select second channel for receive
bfin_write_SPORT_MTCS0(0x2); //Select second channel for transmit
// disable others channels...
bfin_write_SPORT_MRCS1(0);
bfin_write_SPORT_MTCS1(0);
bfin_write_SPORT_MRCS2(0);
bfin_write_SPORT_MTCS2(0);
bfin_write_SPORT_MRCS3(0);
bfin_write_SPORT_MTCS3(0);
SSYNC();
bfin_write_SPORT_TCR1(bfin_read_SPORT_TCR1() | TSPEN); //Enable SPORT
bfin_write_SPORT_RCR1(bfin_read_SPORT_RCR1() | RSPEN); //Enable SPORT
for(;;)
{
if(bfin_read_SPORT_STAT() & RXNE)
printk("receive byte = %d\n", bfin_read16(SPORT1_RX));
else
printk("FIFO empty\n");
}
QuoteReplyEditDelete
2010-08-02 05:07:35 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Mike Sinkovsky (RUSSIAN FEDERATION)
Message: 92043
А чего добиться то хотел?
Насколько я понял, нужно 16 тайм-слотов по 8 бит в каждом? И с синхронизацией от процессора?
Странная какая-то конфигурация, обычно по 32 или 128 тайм-слотов бывает.
QuoteReplyEditDelete
2010-08-02 06:32:15 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Michail Kurochkin (BELARUS)
Message: 92044
Михаил, спасибо за ответ.
Тут нестандартное устройство, требующее по даташиту частоту кадровой синхронизации 8килогерц. А вот частота тактовой синхронизации в этом устройстве может иметь несколько разных вариантов 1024Mhz, 1536Mhz, 2048Mhz, 4096Mhz, 8192Mhz. Пока что, я настроил устройство на 1024Mhz тактовой частоты. Причем частота кадровой синхронизации неменяется не при каком значении тактовой частоты. Всегда строго 8kHz.
Потому при 1024Mhz получается 16 8ми битных каналов. И вот уже который день неполучается настроить фильтр MRCSx чтобы принимать не все 16каналов а только второй. Что каcается передачи, то тут все четко - какой канал включил в тот данные из FIFO (SPORT_TX) и поступают. А вот с приемом непонятка.
QuoteReplyEditDelete
2010-08-02 06:44:26 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Michail Kurochkin (BELARUS)
Message: 92046
Насчет, синхронизации: Тактовая частота подается с внешнего генератора, а кадровая достигается делением тактовой частоты на определенный множитель, такой чтобы кадровая была всегда 8kHz.
QuoteReplyEditDelete
2010-08-02 09:02:57 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Mike Sinkovsky (RUSSIAN FEDERATION)
Message: 92049
Навскидку могу сказать разве что регистр MCMC1 неправильно запрограммирован, должно быть типа такого:
#define TDM_WINDOW (TDM_FREQ / TDM_FRAME_SYNC / 8) /* == 16 */
bfin_write_SPORT_MCMC1 = ((TDM_WINDOW / 8) - 1) << 12; /* == 0x1000 */
А на приеме вообще ничего нет, или со всех каналов?
Если ничего нет, то может аппаратно нужно замкнуть выводы TSCLK и RSCLK.
Хотя я всегда через DMA работал, может в режиме опроса и еще какие тонкости есть.
В общем приложил мой драйвер, он точно работает при 32 и 128 тайм-слотах.
Может там для твоего случая и слишком сложно, но больше вряд ли чем помогу.
sport.c
QuoteReplyEditDelete
2010-08-05 08:44:05 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Michail Kurochkin (BELARUS)
Message: 92180
Mike thanks. Your driver assist me for DMA configuration. I need a minimum window size - 8words, therefore WSIZE = 0.
#define TDM_WIN_SIZE 8
bfin_write_SPORT0_MCMC1((TDM_WIN_SIZE / 8 - 1) << 12);
However, registers MRCSx not work.
Therefore I read full window (8 words) in DMA buffer with size 8 words. Next I do parse DMA buffer and eject every channel in my according FIFO buffer.
QuoteReplyEditDelete
2010-09-16 01:58:15 Re: Can't disable certain RX TDM channel in SPORT TDM mode.
Mike Sinkovsky (RUSSIAN FEDERATION)
Message: 93484
Sorry, I just noticed that I lied in prev message - RFS-TFS and RCLK-TCLK pins must NOT be connected in multichannel mode!
From Blackfin Processor Hardware Reference:
"In Multichannel mode, RSCLK can either be provided externally or gener-
ated internally by the SPORT, and it is used for both transmit and receive
functions. Leave TSCLK disconnected if the SPORT is used only in multi-
channel mode. If RSCLK is externally or internally provided, it will be
internally distributed to both the receiver and transmitter circuitry.
....
RFS signals start of frame
TFS is used as “Transmit Data Valid” for external logic, true only during
transmit channels"
Actually in all our boards TFS and TCLK was disconnected, but I am ust programmer, not hardware designer, and didnt noticed.
If thiese pins is connected on your borad - maybe it is source of problem?