Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение АЦП через I2S на lpc17xx
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kostyan
Народ, спецы по I2S, подскажите как жить!

Пытаюсь сделать чтение из АЦП по I2S на LPC1788. Всякие настройки уже покрутил - в итоге есть "правильная" картинка на логическом анализаторе: все три сигнала есть SCK, WS, SD. Вродебы и код написан правильно - попадаю в прерывание. Но читаются почемуто одни только нули! Хотя на осцилограмме сигнал не нулевой и для "правого" и для "левого" канала. Даже чтение через ДМА вроде как прикрутил - в прерывание от окончания чтения попадаю, но опять же одни нули. Настраивал один только приемник, может с передатчиком чегото надо покрутить еще?

Вот код инициализации:

CODE

I2S_Init(LPC_I2S);

I2S_CFG_Type I2S_ConfigStruct;
I2S_ConfigStruct.wordwidth = I2S_WORDWIDTH_8;
I2S_ConfigStruct.mono = I2S_MONO;
I2S_ConfigStruct.stop = I2S_STOP_DISABLE;
I2S_ConfigStruct.reset = I2S_STOP_DISABLE;
I2S_ConfigStruct.ws_sel = I2S_MASTER_MODE;//I2S_MASTER_MODE;
I2S_ConfigStruct.mute = I2S_MUTE_DISABLE;
I2S_ConfigStruct.ws_halfperiod = 0;//32;//24 * 4;
I2S_Config(LPC_I2S, I2S_RX_MODE, &I2S_ConfigStruct);

I2S_MODEConf_Type I2S_ClkConfig;
I2S_ClkConfig.clksel = I2S_CLKSEL_FRDCLK;
I2S_ClkConfig.fpin = I2S_4PIN_DISABLE;
I2S_ClkConfig.mcena = I2S_MCLK_DISABLE;
I2S_ModeConfig(LPC_I2S, &I2S_ClkConfig, I2S_RX_MODE);

I2S_FreqConfig(LPC_I2S, SCLK_FREQUENCY_2560, I2S_RX_MODE);

I2S_Stop(LPC_I2S, I2S_RX_MODE);

IRQ_ConfigureIT(I2S_IRQn, 2);
IRQ_EnableIT(I2S_IRQn);

I2S_IRQConfig(LPC_I2S, I2S_RX_MODE, 1);
I2S_IRQCmd(LPC_I2S, I2S_RX_MODE, ENABLE);
I2S_Start(LPC_I2S);


Вот код прерывания (не ДМА, его пока отключил):
CODE

uint32_t RXLevel = 0;

//Check RX interrupt
if(LPC_I2S->STATE & 0x01)
{
RXLevel = I2S_GetLevel(LPC_I2S, I2S_RX_MODE);
if ((RXLevel != 0) && !I2SRXDone )
{
while ( RXLevel > 0 )
{
if (I2SReadLength == BUFFER_SIZE)
{
//Stop RX
//I2S_Stop(LPC_I2S, I2S_RX_MODE);
// Disable RX
//I2S_IRQCmd(LPC_I2S, I2S_RX_MODE, DISABLE);
I2SRXDone = 0;
I2SReadLength = 0;
break;
}
else
{
dummy = LPC_I2S->RXFIFO;
if (dummy != 0)
{
asm("nop");
}
I2SRXBuffer[I2SReadLength++] = dummy;
}
RXLevel--;
}
}
}
fox2trot
Вы забыли уточнить из какого АЦП вы читаете. Их много и инициализация может ну очень сильно отличатся. wink.gif
А вообще то, почитайте еще раз документацию на сам АЦП, сдается мне что вы что-то упустили. Т.ч. кроме вас самих вам вряд-ли кто-то поможет.
kostyan
АЦП ads1274, ноги на проце такие:
PINSEL_ConfigPin(0, 25, 2);
PINSEL_ConfigPin(0, 23, 2);
PINSEL_ConfigPin(0, 24, 2);


АЦП здесь непричем: "Хотя на осцилограмме сигнал не нулевой и для "правого" и для "левого" канала." Т.е. сигнал на SD болтается и никак не нулевой...
kostyan
Вот это да! Перебросил PINSEL_ConfigPin(0, 25, 2) на PINSEL_ConfigPin(0, 6, 1) и прием попер!!! Однако.

Народ, а ревизию проца я правильно понимаю: ZSD1139E, E - это последняя, третья ревизия?
jcxz
Недавно было: http://electronix.ru/forum/index.php?showtopic=102089
kostyan
Господа специалисты по I2S и филипсу - таки помогите добить чтение из ацп ads1274!

Прием пошел, но... не могу добиться правильного приема.

Насколько понял из описания ацп, он должен на один период сигнала WS (сначала WS=1, а потом WS = 0) выдать по клокам SCK четыре 24х битных значения (все четыре канала включены). Итого 96 бит. Возникает вопрос - как принять эти 96 бит контроллером? Сейчас играюсь с параметрами приемника. На осцилографе на графическом анализаторе вижу картинку похожую на правду. АЦП при WS=1 выдает какието данные - максимум 24 разряда, остальное время нуль. Я расчитывал настроить I2S приемник таким образом, чтобы он выдавал 96 слоков SCK на один период сигнала WS (сначала WS=1, а потом WS = 0). Это достигается, насколько я понял битами ws_halfperiod регистра I2SDAI. Вроде бы получил требуемое. И я ожидал что по этим 96 клокам я приму I2S приемником три 32х разрядных значения (3*32=96)! Но!!! Сколько бы клоков я не устанавливал внутри периодна сигнала WS я по факту принимаю всегда два чередующихся 32х битных значения. Первое - это которое приходит с WS сигнала, когда WS = 1: значение похоже на правду и имеет разрядность 24 бита (последний байт нулевой). И второе значение - всегда ноль - я думаю оно отсчитывается не по клокам сразу же за первым значением, а принимается по переходу сигнала WS с еденицы в нуль, то есть когда WS=0. То есть получается, что I2S приемник контроллера принимает ровно одно 32х битное значание на полупериод сигнала WS, а на остальные клоки что идут далее в этом же периоде забивает! Это правильное поведение I2S приемника, или я гдето чтото не донастроил? Если это правильно поведение, тогда зачем вообще нужен этот ws_halfperiod регистра I2SDAI?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.