Jump to content

    
Sign in to follow this  
kostyan1

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

Recommended Posts

Народ, спецы по 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--;
		}
	}
}

Share this post


Link to post
Share on other sites

Вы забыли уточнить из какого АЦП вы читаете. Их много и инициализация может ну очень сильно отличатся. ;)

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

Edited by fox2trot

Share this post


Link to post
Share on other sites

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

PINSEL_ConfigPin(0, 25, 2);

PINSEL_ConfigPin(0, 23, 2);

PINSEL_ConfigPin(0, 24, 2);

 

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this