реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Чтение АЦП через I2S на lpc17xx, читаются одни нули!
kostyan
сообщение May 12 2012, 10:23
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Народ, спецы по 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--;
}
}
}
Go to the top of the page
 
+Quote Post
fox2trot
сообщение May 13 2012, 21:39
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 22-09-07
Из: Орел
Пользователь №: 30 754



Вы забыли уточнить из какого АЦП вы читаете. Их много и инициализация может ну очень сильно отличатся. wink.gif
А вообще то, почитайте еще раз документацию на сам АЦП, сдается мне что вы что-то упустили. Т.ч. кроме вас самих вам вряд-ли кто-то поможет.

Сообщение отредактировал fox2trot - May 13 2012, 21:46
Go to the top of the page
 
+Quote Post
kostyan
сообщение May 14 2012, 02:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



АЦП ads1274, ноги на проце такие:
PINSEL_ConfigPin(0, 25, 2);
PINSEL_ConfigPin(0, 23, 2);
PINSEL_ConfigPin(0, 24, 2);


АЦП здесь непричем: "Хотя на осцилограмме сигнал не нулевой и для "правого" и для "левого" канала." Т.е. сигнал на SD болтается и никак не нулевой...
Go to the top of the page
 
+Quote Post
kostyan
сообщение May 14 2012, 04:17
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Вот это да! Перебросил PINSEL_ConfigPin(0, 25, 2) на PINSEL_ConfigPin(0, 6, 1) и прием попер!!! Однако.

Народ, а ревизию проца я правильно понимаю: ZSD1139E, E - это последняя, третья ревизия?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 14 2012, 04:43
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Недавно было: http://electronix.ru/forum/index.php?showtopic=102089
Go to the top of the page
 
+Quote Post
kostyan
сообщение May 16 2012, 05:38
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Господа специалисты по 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?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 06:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016