Imin 0 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба Добрый день. Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC. Примеры передачи: Код в МК для приема: 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. Подскажите, пожалуйста, в чем может быть проблема ? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба Добрый день. Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC. МК тактируется от 16 МГц, а ПЛИС - от внутреннего генератора на 5 МГц. С ПЛИС отправляю 0xFFFFFFFF и CRC сумму этого числа 0x1DOF. МК правильно принимает 1 передачу через 3. Подскажите, пожалуйста, в чем может быть проблема ? Спасибо. А по какому сигналу МК начинает чтение? Есть ли заголовок сообщения? Передача идет последовательным кодом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба ..почему не использовали SPI микроконтроллера? как раз три ноги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Imin 0 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба А по какому сигналу МК начинает чтение? Есть ли заголовок сообщения? Передача идет последовательным кодом? Сброс у МК и ПЛИС одновременный, передача данных идет всегда. Определенного сигнала чтения нет. Заголовка сообщения нету. Да, передача идет последовательным кодом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба Сброс у МК и ПЛИС одновременный, передача данных идет всегда. Определенного сигнала чтения нет. Заголовка сообщения нету. Да, передача идет последовательным кодом. Поздравляю! Достаточно одного ложного фронта и больше ничего работать не будет до следующего сброса... Или скажем в МК сработает прерывание и он отвлечется немного... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба ..может вы выдаёте код из плис неправильно? можно её код посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1113 5 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба на какой частоте работает ядро процессора? вы уверены, что процессор успевает по времени обрабатывать 5 МГц циклы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Imin 0 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба на какой частоте работает ядро процессора? вы уверены, что процессор успевает по времени обрабатывать 5 МГц циклы? Ядро процессора работает на 16 МГц. Частота передачи 80 Гц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Imin 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба ..может вы выдаёте код из плис неправильно? можно её код посмотреть? Да вот: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Imin 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Если Вы не используете SPI, то нельзя-ли обрабатывать прерывание от фронта CLK, и в этом прерывании читать порт и сдвигать? Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 25 августа, 2016 Опубликовано 25 августа, 2016 (изменено) · Жалоба Извините меня, но я не понял вашу идею. Не могли бы объяснить по-другому? Если я правильно понял, Вы в бесконечном цикле читаете GPIO, ловя, фронты импульсов RD и CLK. Если это действительно так, то лучше бы это делать по прерываниям EXTI. Изменено 25 августа, 2016 пользователем Aleksandr Baranov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alag57 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Есть плата с МК STM32F103 и ПЛИС MAX II. Дали задачу реализовать интерфейс передачи данных между ними. ПЛИС постоянно отправляет данные в МК . Используются три линии: CLK, DATA, RD. Формат данных: 32 бита данные + 16 бит CRC. Линия RD нужна для оповещения МК о передаче CRC. Сделать линию RD для оповещения МК о начале передачи данных, включая CRC. Думаю изменений в коде для плиски минут на 5 работы. Затем применить для приема этих 6 байт SPI, как уже отмечали выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться