Перейти к содержанию
    

McASP на передачу данных в L138 в TDM режиме

Оно так и сделано, только заведено на AHCLKX (выше схему выкладывал), но возникла проблемка с синхронизацией (описывается примерно с начала данной страницы), поэтому и ищу способ, как лучше отформатировать принимаемые данные.

Прошу прощения схемы сразу не разглядел. Посмотрел на времянки Вашего ST-Bus - такой frame - тяжелый случай для - MCASP. С двойными клоками - еще одна засада - нужно попасть на нужный клок при старте автомата состояний - иначе имеем ошибку 1/2 бита - что вполне может приводить к срыву синхронизации и ошибкам при приеме данных. Возможный вариант - подождать нужного фронта фрейма и затем нужного франта клока и тогда запустить синхронизацию. Пока больше вариантов не вижу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможный вариант - подождать нужного фронта фрейма и затем нужного франта клока и тогда запустить синхронизацию. Пока больше вариантов не вижу...

Не совсем понял, что Вы хотели сказать.

Пока решил сделать вот что:

1) От модема приходит 32 слота по 8 бит каждый и по два такта клока на один бит (32 х 8 х 2 = 512 клоков).

2) Работаем на частоте и по фрейму передатчика.

4) Настраиваем McASP в TDM Mode 32 слота по 16 бит каждый и 1 клок на 1 бит (32 х 16 х 1 = 512 клоков).

5) Каждый слот тогда будет представлять последовательность бит {b7,b7,b6,b6,b5,b5,b4,b4,b3,b3,b2,b2,b1,b1,b0,b0}.

6) Программно преобразуем принятый слот к полезным 8-ми битным данным и получаем {b7,b6,b5,b4,b3,b2,b1,b0}.

Для того, чтоб принимать корректные данные вначале необходимо переключить модем на скорость 160 kbit/s, для этого ему необходимо в первом слоте отправить посылку 0x3F. Вот тут я что-то напутал (пока не пойму что), принимать более-менее похожие на правду данные получается только с приёмником настроенным в режиме TDM со слотом 32-бита и передатчиком настроеннам в Burst Mode, где в первом слоте отправляю 0x0FFF (0x3F c удвоенными битами). Принимаемое голосовое сообщение получается как бы в ускоренном режиме. При попытке работы передатчика в TDM Mode, он отказывается что-либо передавать.

Может быть можно сразу (при помощи конфигурации McASP) осуществить приём правильных 8-битных данных, без использования программных преобразований?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нашёл свой баг с ускоренным воспроизведением, настраивал TDM с длиной слота 32-бита и 32 слотами, а надо было с 16 слотами, счас стало нормально воспроизводить.

Остаётся разобраться, почему передатчик не хочет в режиме TDM работать, ну и возможность аппаратной конвертации данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаем тему TDM-DMA! :)

 

Вот почти у меня получилось сделать так, чтобы система заработала с DMA и TDM, но возникла другая проблема. По непонятным пока причинам у меня зависает передатчик.

По идее, он зависать не должен, но после нескольких записей DMA зависает. Скажу сразу, что DMA у меня программируются автоматом, я их не зупускаю руками (сам код в самом конце приведу).

 

Вполне может быть что AFIFO инициализированы не верно, но тут возникает вопрос - а как правильно?

 

По идее, NUMDMA должно быть к примеру 16, но при этом контроллер DMA не хочет генерить прерывание. :)

Может кто знает, как правильно указать размерности А и Б счетчиков?

 

Вот как у меня:

this->McaspFifoRegs->WFIFOCTL = (1<<0)|(16<<8); // Это я установил, что DMA должен записывать сразу 16 слов по 32 бита. Если этот параметр 1, то все работает!

 

А вот инициализация счетчиков DMA, но где-то здесь должно фигурировать число 16, так как оно теперь триггер записи:

this->dma_tx->PaRAM->OPT = 0;

this->dma_tx->PaRAM->OPT = (1<<24)| (1<<20)| (this->dma_tx->dma_num<<12); // прерывание в конце, AB счетчик и т.д....

this->dma_tx->PaRAM->DST = (Uint32)(CSL_MCASP_0_DATA_REGS);//;

this->dma_tx->PaRAM->A_B_CNT = 0; // это в самом начале

this->dma_tx->PaRAM->SRC_DST_BIDX = 0x00000004; // source - 4 bytes

this->dma_tx->PaRAM->SRC_DST_CIDX = 0;

this->dma_tx->PaRAM->LINK_BCNTRLD = 0x0000FFFF;

this->dma_tx->PaRAM->CCNT = 1;

this->dma_tx->Enable(true); // разрешаем сам ДМА

 

this->dma_tx->PaRAM->SRC = (Uint32)test_mcasp_buff0_tx;

this->dma_tx->PaRAM->A_B_CNT = ((length)<<16)|(4&0x0000ffff); // передаем массив длиной length по 4 байта за событие

this->dma_tx->EventEnable(); // разрешаем прерывание

 

Либо SRC_DST_BIDX надо где-то вставить 16, либо в A_B_CNT.

 

Если кто знает, поделитесь! :)

 

Вот код, как у меня работает сразу несколько буферов данных чтобы сериалайзер не зависал, но он гад зависает!:

 

	
       this->dma_tx->EventDisable();

for (int i=0 ; i< 4 ; i++)
{
	this->dma_tx->PaRAMs[i]->OPT = 0;
	this->dma_tx->PaRAMs[i]->OPT = (1<<24)| (1<<20)| (this->dma_tx->dma_num<<12);
	this->dma_tx->PaRAMs[i]->DST = (Uint32)(CSL_MCASP_0_DATA_REGS);//;
	this->dma_tx->PaRAMs[i]->A_B_CNT = 0; 
	this->dma_tx->PaRAMs[i]->SRC_DST_BIDX = 0x00000004; // source - 4 bytes
	this->dma_tx->PaRAMs[i]->SRC_DST_CIDX = 0;
	this->dma_tx->PaRAMs[i]->LINK_BCNTRLD = 0x0000FFFF;
	this->dma_tx->PaRAMs[i]->CCNT = 1;

}

       // здесь идет зацикливание, и оно реально работает. Просто недолго.
this->dma_tx->PaRAMs[0]->LINK_BCNTRLD = 0x20*(int)this->dma_tx->params[1] + 0x4000;
this->dma_tx->PaRAMs[1]->LINK_BCNTRLD = 0x20*(int)this->dma_tx->params[2] + 0x4000;
this->dma_tx->PaRAMs[2]->LINK_BCNTRLD = 0x20*(int)this->dma_tx->params[3] + 0x4000;
this->dma_tx->PaRAMs[3]->LINK_BCNTRLD = 0x20*(int)this->dma_tx->params[1] + 0x4000;
this->dma_tx->Enable(true);

for (int i=0 ; i< 4 ; i++)
{
	this->dma_tx->PaRAMs[i]->A_B_CNT = ((length)<<16)|(4&0x0000ffff); // 4 bytes
}

this->dma_tx->PaRAM->SRC = (Uint32)test_mcasp_buff0_tx;
this->dma_tx->PaRAM->A_B_CNT = ((length)<<16)|(4&0x0000ffff); // 4 bytes

this->dma_tx->PaRAMs[0]->SRC = (Uint32)test_mcasp_buff0_tx;
this->dma_tx->PaRAMs[1]->SRC = (Uint32)test_mcasp_buff1_tx;
this->dma_tx->PaRAMs[2]->SRC = (Uint32)test_mcasp_buff2_tx;
this->dma_tx->PaRAMs[3]->SRC = (Uint32)test_mcasp_buff3_tx;
this->dma_tx->EventEnable();

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет еще раз! :)

В общем, дело обстоит сейчас так...

 

Я выяснил, что DMA к проблеме вообще не относится. Если я работаю без DMA а с AFIFO, то тогда проблема зависания TX порта всеравно присутствует.

По какой-то причине, даже когда фифо не пустое, передатчик приходит в состояние оверан, и прекращает передачу. ФИФО точно не пустое! Выглядет это так: передатчик передает какое-то количество слов (например 12) и зависает. Фифо при этом не переполнено и не пустое.

 

В чем причина того, почему фифо не хочет писать в передатчик, для меня загадка.

Подскажите, может кто решал подобную проблему?

 

Спасибо,

Дмитрий

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

 

Отвечаю сам себе. :)

В общем, это бага чипа. Вот что пишут сами ТИ:

2.1.6 McASP: Inactive Slot Usage Note

On all silicon revisions, in any McASP serializer configured a transmit serializer with an n-slot TDM, data

transfer can fail if both of the conditions below are true:

1. one or more time slots within the n-slot TDM are configured as inactive and

2. EDMA is used to transfer data to McASP

If the conditions mentioned above exists, either the transmit operation may fail to start with the XDATA bit

in the Transmit Status Register (XSTAT) set or if the transmit operation has started, random underrun

errors may occur breaking the data transfer operation.

To ensure correct McASP transmit operation with EDMA triggered data transfers, all time slots in an n-slot

TDM should be configured as active slots. For example, if a serializer is configured for transmit operation

with a 5-slot TDM frame in which it is only required to transmit data in slots 0 to 2, all five slots (0 to 4)

should be configured as active in the Transmit TDM Time Slot Register (XTDM). In this example the

remaining time slots (slot 5 onwards) can be configured as inactive. The EDMA configuration and user

application should account for the transfer of extra data to the McASP for slots 3 and 4.

 

Я еще не проверял, но похоже что с AFIFO будет та-же проблема. Как проверю - напишу. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Проблема была в чипе. Теперь, когда разрешены все каналы на передачу, все заработало. :)

Изменено пользователем Russky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...