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

STM32F103 + ПЛИС MAX II

Добрый день.

 

Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC.

Примеры передачи:

 

CLK_DATA.jpg

 

 

CLK_RD.jpg

 

 

RD_DATA.jpg

 

Код в МК для приема:

while (1) {

     if(RD) //Проверяем сигнал отправки CRC cуммы
{	 
     if(CLK)//Проверка положительного фронта частоты
	{
	    if(isReady == 0)//Проверка смены такта частоты CLK
		{
		    isReady = 1;

		    if(IN) // Проверка на 1 или 0 входных данных
			{
			    miso |= mask;
			}

			mask <<= 1;// сдвиг маски

			if(mask > 0x8000)//проверка достигла ли маска оговоренной длины
			  {	

			      if(miso == 0x1D0F) {
							        MDR_PORTB->RXTX ^= toggle;	//мигаем светодиодом
						  }
				mask = 0x01;
				miso =	0;

                                    }
			}

	}
            else
		{
			isReady = 0;
		}

 

МК тактируется от 16 МГц, а ПЛИС - от внутреннего генератора на 5 МГц. С ПЛИС отправляю 0xFFFFFFFF и CRC сумму этого числа 0x1DOF.

МК правильно принимает 1 передачу через 3.

 

Подскажите, пожалуйста, в чем может быть проблема ?

Спасибо.

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


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

Добрый день.

 

Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC.

 

МК тактируется от 16 МГц, а ПЛИС - от внутреннего генератора на 5 МГц. С ПЛИС отправляю 0xFFFFFFFF и CRC сумму этого числа 0x1DOF.

МК правильно принимает 1 передачу через 3.

 

Подскажите, пожалуйста, в чем может быть проблема ?

Спасибо.

 

А по какому сигналу МК начинает чтение? Есть ли заголовок сообщения? Передача идет последовательным кодом?

 

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


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

А по какому сигналу МК начинает чтение? Есть ли заголовок сообщения? Передача идет последовательным кодом?

 

Сброс у МК и ПЛИС одновременный, передача данных идет всегда. Определенного сигнала чтения нет.

Заголовка сообщения нету. Да, передача идет последовательным кодом.

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


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

Сброс у МК и ПЛИС одновременный, передача данных идет всегда. Определенного сигнала чтения нет.

Заголовка сообщения нету. Да, передача идет последовательным кодом.

Поздравляю! Достаточно одного ложного фронта и больше ничего работать не будет до следующего сброса...

Или скажем в МК сработает прерывание и он отвлечется немного...

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


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

..может вы выдаёте код из плис неправильно? можно её код посмотреть?

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


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

Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать?

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


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

на какой частоте работает ядро процессора?

вы уверены, что процессор успевает по времени обрабатывать 5 МГц циклы?

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


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

на какой частоте работает ядро процессора?

вы уверены, что процессор успевает по времени обрабатывать 5 МГц циклы?

Ядро процессора работает на 16 МГц. Частота передачи 80 Гц.

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


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

..может вы выдаёте код из плис неправильно? можно её код посмотреть?

Да вот:

 

module CRC(

 input clk,
 input reset,
 input data_in,
 output reg RD,
 output   out

 );

 reg [15:0] lfsr_c;

 reg [15:0] counter;
 reg [15:0] sr;
 reg [15:0] lfsr_q;
 reg flag;



 always @(posedge clk or negedge reset ) begin
   if(!reset) begin
     lfsr_q <= {16{1'b1}};
	counter <= 0;
	sr<=0;
	flag <= 0;	
   end
   else begin
     lfsr_q <=  lfsr_c;


counter <= counter + 1;

sr[14:0] <= sr[15:1];

 case(counter)

	15: begin   sr <= 0; 

	 if(flag) begin   lfsr_q <= {16{1'b1}};
                                     flag <= 0; 
                                     counter <= 0; end

			end


	32: begin sr <=  lfsr_q;	

			end

endcase


if(counter == 33) begin 
		flag <= 1;			
		counter <= 0;
		lfsr_q <= {16{1'b1}};

end//if


 end
 end // always

  always @(negedge clk ) begin

 case(counter)

	15:		RD<= 0; 

	32:  	        RD<= 1;	


endcase


 end // always


 always @(*) begin

   lfsr_c[0] = lfsr_q[15] ^ data_in;
   lfsr_c[1] = lfsr_q[0];
   lfsr_c[2] = lfsr_q[1];
   lfsr_c[3] = lfsr_q[2];
   lfsr_c[4] = lfsr_q[3];
   lfsr_c[5] = lfsr_q[4] ^ lfsr_q[15] ^ data_in;
   lfsr_c[6] = lfsr_q[5];
   lfsr_c[7] = lfsr_q[6];
   lfsr_c[8] = lfsr_q[7];
   lfsr_c[9] = lfsr_q[8];
   lfsr_c[10] = lfsr_q[9];
   lfsr_c[11] = lfsr_q[10];
   lfsr_c[12] = lfsr_q[11] ^ lfsr_q[15] ^ data_in;
   lfsr_c[13] = lfsr_q[12];
   lfsr_c[14] = lfsr_q[13];
   lfsr_c[15] = lfsr_q[14];




 end // always



assign out = sr[0];


endmodule

 

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


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

Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать?

 

Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому?

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


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

Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому?

Если я правильно понял, Вы в бесконечном цикле читаете GPIO, ловя, фронты импульсов RD и CLK. Если это действительно так, то лучше бы это делать по прерываниям EXTI.

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

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


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

Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC.

 

Сделать линию RD для оповещения МК о начале передачи данных, включая CRC.

Думаю изменений в коде для плиски минут на 5 работы.

Затем применить для приема этих 6 байт SPI, как уже отмечали выше.

 

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


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

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

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

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

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

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

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

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

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

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