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

Чтение АЦП через I2S на lpc17xx

Народ, спецы по I2S, подскажите как жить!

 

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

 

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

 

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);

 

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

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

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


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

АЦП ads1274, ноги на проце такие:

PINSEL_ConfigPin(0, 25, 2);

PINSEL_ConfigPin(0, 23, 2);

PINSEL_ConfigPin(0, 24, 2);

 

 

АЦП здесь непричем: "Хотя на осцилограмме сигнал не нулевой и для "правого" и для "левого" канала." Т.е. сигнал на SD болтается и никак не нулевой...

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


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

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

 

Народ, а ревизию проца я правильно понимаю: ZSD1139E, E - это последняя, третья ревизия?

 

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


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

Господа специалисты по 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?

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


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

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

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

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

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

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

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

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

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

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