|
|
  |
STM32F103 + ПЛИС MAX II |
|
|
|
Aug 24 2016, 14:29
|
Группа: Участник
Сообщений: 5
Регистрация: 22-05-14
Из: Москва
Пользователь №: 81 742

|
Добрый день. Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC. Примеры передачи:    Код в МК для приема: CODE 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. Подскажите, пожалуйста, в чем может быть проблема ? Спасибо.
|
|
|
|
|
Aug 24 2016, 15:15
|
Группа: Участник
Сообщений: 5
Регистрация: 22-05-14
Из: Москва
Пользователь №: 81 742

|
Цитата(iosifk @ Aug 24 2016, 19:08)  А по какому сигналу МК начинает чтение? Есть ли заголовок сообщения? Передача идет последовательным кодом? Сброс у МК и ПЛИС одновременный, передача данных идет всегда. Определенного сигнала чтения нет. Заголовка сообщения нету. Да, передача идет последовательным кодом.
|
|
|
|
|
Aug 24 2016, 16:14
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать?
--------------------
ASB
|
|
|
|
|
Aug 24 2016, 19:02
|
Группа: Участник
Сообщений: 5
Регистрация: 22-05-14
Из: Москва
Пользователь №: 81 742

|
Цитата(1113 @ Aug 24 2016, 20:09)  на какой частоте работает ядро процессора? вы уверены, что процессор успевает по времени обрабатывать 5 МГц циклы? Ядро процессора работает на 16 МГц. Частота передачи 80 Гц.
|
|
|
|
|
Aug 25 2016, 07:43
|
Группа: Участник
Сообщений: 5
Регистрация: 22-05-14
Из: Москва
Пользователь №: 81 742

|
Цитата(Lmx2315 @ Aug 24 2016, 18:32)  ..может вы выдаёте код из плис неправильно? можно её код посмотреть? Да вот: CODE 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
|
|
|
|
|
Aug 25 2016, 08:45
|
Группа: Участник
Сообщений: 5
Регистрация: 22-05-14
Из: Москва
Пользователь №: 81 742

|
Цитата(Aleksandr Baranov @ Aug 24 2016, 19:14)  Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать? Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому?
|
|
|
|
|
Aug 25 2016, 12:26
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(Imin @ Aug 25 2016, 04:45)  Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому? Если я правильно понял, Вы в бесконечном цикле читаете GPIO, ловя, фронты импульсов RD и CLK. Если это действительно так, то лучше бы это делать по прерываниям EXTI.
Сообщение отредактировал Aleksandr Baranov - Aug 25 2016, 12:29
--------------------
ASB
|
|
|
|
|
Aug 25 2016, 13:08
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата(Imin @ Aug 24 2016, 19:29)  Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC. Сделать линию RD для оповещения МК о начале передачи данных, включая CRC. Думаю изменений в коде для плиски минут на 5 работы. Затем применить для приема этих 6 байт SPI, как уже отмечали выше.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|