02.06.2014, 22:08
|
|
Временная регистрация
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Передача данных PIC->MAXII по SPI.
Господа, пытаюсь передать байт из пика в MAXII EPM570T100C5.
PIC 5 вольт, ПЛИС 3,3 Вольта, соединил через диодный интерфейс.
С пика постоянно кидаю один и тот же пакет 025, т.е. 00011001.
Взял готовый модуль SPI с широкоизвестного забугорного сайта:
Код:
|
module SPI_slave(clk, SCK, MOSI, MISO, SSEL, LED,byte_data_received);
input clk;
output reg [7:0] byte_data_received;
input SCK, SSEL, MOSI;
output MISO;
output LED;
//reg [7:0] byte_data_received;
// sync SCK to the FPGA clock using a 3-bits shift register
reg [2:0] SCKr; always @(posedge clk) SCKr ‹= {SCKr[1:0], SCK};
wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges
wire SCK_fallingedge = (SCKr[2:1]==2'b10); // and falling edges
// same thing for SSEL
reg [2:0] SSELr; always @(posedge clk) SSELr ‹= {SSELr[1:0], SSEL};
wire SSEL_active = ~SSELr[1]; // SSEL is active low
wire SSEL_startmessage = (SSELr[2:1]==2'b10); // message starts at falling edge
wire SSEL_endmessage = (SSELr[2:1]==2'b01); // message stops at rising edge
// and for MOSI
reg [1:0] MOSIr; always @(posedge clk) MOSIr ‹= {MOSIr[0], MOSI};
wire MOSI_data = MOSIr[1];
// we handle SPI in 8-bits format, so we need a 3 bits counter to count the bits as they come in
reg [2:0] bitcnt;
reg byte_received; // high when a byte has been received
//reg [7:0] byte_data_received;
always @(posedge clk)
begin
if(~SSEL_active)
bitcnt ‹= 3'b000;
else
if(SCK_risingedge)
begin
bitcnt ‹= bitcnt + 3'b001;
// implement a shift-left register (since we receive the data MSB first)
byte_data_received ‹= {byte_data_received[6:0], MOSI_data};
end
end
/*
always @(posedge clk)
begin
byte_received ‹= SSEL_active && SCK_risingedge && (bitcnt==3'b111);
if(byte_received==1'b1)
begin
byte_data_received_buf = byte_data_received;
//byte_data_received_buf =50;
end
end
*/
// we use the LSB of the data received to control an LED
reg LED;
always @(posedge clk) if(byte_received) LED ‹= byte_data_received[0];
reg [7:0] byte_data_sent;
reg [7:0] cnt;
always @(posedge clk) if(SSEL_startmessage) cnt‹=cnt+8'h1; // count the messages
always @(posedge clk)
if(SSEL_active)
begin
if(SSEL_startmessage)
byte_data_sent ‹= cnt; // first byte sent in a message is the message count
else
if(SCK_fallingedge)
begin
if(bitcnt==3'b000)
byte_data_sent ‹= 8'h00; // after that, we send 0s
else
byte_data_sent ‹= {byte_data_sent[6:0], 1'b0};
end
end
assign MISO = byte_data_sent[7]; // send MSB first
// we assume that there is only one slave on the SPI bus
// so we don't bother with a tri-state buffer for MISO
// otherwise we would need to tri-state MISO when SSEL is inactive
endmodule |
clk - у меня подключен в кварцу на плате 50МГц,
SCK - это такт SPI, в проге пика это Soft_SPI 20 МГц.
Вывел регистр byte_data_received наружу, на свободные пины плис.
И посмотрел логическим анализатором(см вложение).
На картинках каждый канал анализатора подключен к соответствующему биту регистра byte_data_received (названия каналов не смотрите это от проверки канала SPI осталось), вертикальные линии это моменты приема пакета. Мы видим, чnо большую часть времени в регистре правильное значение, но временами некоторые биты переходят в неправильное значение.
Сами передаваемые данные не раз проверял тем же логическим анализатором, все отсылается и на пины плис приходит как по учебнику.
Прошу совета, в чем же может быть ошибка
|
|
|
|
03.06.2014, 00:36
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Частоты clk и SCK довольно близкие. Попробуйте немного сдвинуть момент определения rising_edge у тактов SPI.
Цитата:
|
wire SCK_risingedge = (SCKr[1:0]==2'b01);
|
Видимо, используется мода 0, т.е. данные действительны при переходе 0-›1 SCK. А у Вас тратится два тика 50МГц для определения этого фронта: первый тик SCKr = 001, второй тик SCKr = 011 или SCKr = 010, что может быть уже поздно для захвата MOSI_data.
|
|
|
|
03.06.2014, 06:59
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Сообщение от feo
|
кидаю один и тот же пакет 025, т.е. 00011001.
|
??? Вообще-то 25 выглядит бинарно, как: 00 100101, а у Вас расписано 19.
|
|
|
|
03.06.2014, 11:44
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Не извращайтесь. Принимайте данные по родному клоку, а если нужна синхронизация то синхронизируйте уже готовый байт.
|
|
|
|
03.06.2014, 13:27
|
|
Временная регистрация
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Сообщение от Halex07
|
??? Вообще-то 25 выглядит бинарно, как: 00100101, а у Вас расписано 19.
|
Калькулятор винды с Вами не согласен, я тоже.
25=00011001
А то что Вы написали - это 37.
Как я понимаю все сходятся на мнении, что проблема в синхронизации?
|
|
|
|
03.06.2014, 13:50
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Вот так принимать попробуйте.
always @(posedge SCK)
begin
bitcnt ‹= bitcnt + 3'b001;
byte_data_received ‹= {byte_data_received[6:0], MOSI_data};
end
|
|
|
|
05.06.2014, 22:34
|
|
Временная регистрация
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Сообщение от Impartial
|
Вот так принимать попробуйте.
always @(posedge SCK)
begin
bitcnt ‹= bitcnt + 3'b001;
byte_data_received ‹= {byte_data_received[6:0], MOSI_data};
end
|
изменил участок кода, начал детектировать по SCK - никакого отличия, все тоже самое.
Код:
|
always @(posedge SCK)
begin
if(~SSEL_active)
bitcnt ‹= 3'b000;
else
if(SCK_risingedge)
begin
bitcnt ‹= bitcnt + 3'b001;
// implement a shift-left register (since we receive the data MSB first)
byte_data_received ‹= {byte_data_received[6:0], MOSI_data};
end
end |
Да, Господа, я и себя и вас ввел в заблуждение: Soft_SPI конечно 20 кГц, а не мегагерц. Если этот момент на что-то влияет.
Последний раз редактировалось feo; 05.06.2014 в 22:42.
|
|
|
|
06.06.2014, 10:22
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Сообщение от feo
|
изменил участок кода, начал детектировать по SCK - никакого отличия, все тоже самое.
|
Ошибка то осталась. Так вообще нет смысла делать.
Сообщение от feo
|
if(SCK_risingedge)
|
Если не владеете верилогом не нужно мудрить. Нарисуйте просто схему в графическом редакторе квартуса.
|
|
|
|
07.06.2014, 19:20
|
|
Временная регистрация
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Цитата:
|
Если не владеете верилогом не нужно мудрить. Нарисуйте просто схему в графическом редакторе квартуса.
|
Это не совет: не умеешь на верилоге - не пиши на нем.
На данный момент ушел от ошибки тем, что посылаю пакет только по изменению в нем передаваемого значения, а не постоянно.
Пакеты приходят редко, ошибки нет(или просто не вылезает она). Отчего она присутствует при постоянной передаче, так и не выяснил.
|
|
|
|
26.07.2014, 08:59
|
|
Временная регистрация
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Передача данных PIC->MAXII по SPI.
Спасибо всем за советы! Все-таки я добился стабильной передачи данных с пика в плис.
С пика я передаю данные для шим, задача организовать 10 независимых каналов шим в плис, заполнение задается пиком. Т.е. надо передать 10 байт информации.
Но вот загвоздка: стоит мне убрать строку из главного модуля
output wire [39:0]byte_data_received
как мои шим перестают генерироваться.
Господа подскажите в чем может быть ошибка?
ссылка на файлы проекта:
yadi.sk/d/IgTWpxFiXdfYo
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Кто-нибудь работал с RF модулями nRF2401A?
|
Easyrider83 |
Автоматика и аппаратура связи |
1481 |
04.09.2021 23:24 |
Pic: слитный прием данных по SPI.
|
JekaKey |
PIC |
5 |
06.03.2013 09:58 |
Литература по микроконтроллерам (AVR, PIC, ПЛИС и т.д.). Сборка книг - (256 книг+ 27 CD c примерами из книг) [обновление 2011, PDF, DJVU]
|
yurinform |
Микроконтроллеры, АЦП, память и т.д |
5 |
05.07.2011 19:00 |
Передача данных по SPI на 20 метров
|
KGN |
Микроконтроллеры, АЦП, память и т.д |
17 |
20.08.2010 21:33 |
Помогите с ЦАП AD7708/AD7718 или их аналогами
|
ST_Senya |
Микроконтроллеры, АЦП, память и т.д |
9 |
30.11.2009 19:03 |
Часовой пояс GMT +4, время: 00:12.
|
|