Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Передача данных PIC->MAXII по SPI.

Непрочитано 02.06.2014, 22:08  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
Вопрос Передача данных 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о большую часть времени в регистре правильное значение, но временами некоторые биты переходят в неправильное значение.
Сами передаваемые данные не раз проверял тем же логическим анализатором, все отсылается и на пины плис приходит как по учебнику.

Прошу совета, в чем же может быть ошибка
Миниатюры:
Нажмите на изображение для увеличения
Название: Безымянный1.jpg
Просмотров: 475
Размер:	373.9 Кб
ID:	65152  
Реклама:
feo вне форума  
Непрочитано 03.06.2014, 00:36  
Yurkin2014
Заблокирован
 
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
Yurkin2014 на пути к лучшему
По умолчанию 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.
Yurkin2014 вне форума  
Непрочитано 03.06.2014, 06:59  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,693
Сказал спасибо: 28
Сказали Спасибо 4,526 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Сообщение от feo Посмотреть сообщение
кидаю один и тот же пакет 025, т.е. 00011001.
??? Вообще-то 25 выглядит бинарно, как: 00100101, а у Вас расписано 19.
Halex07 вне форума  
Непрочитано 03.06.2014, 11:44  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Не извращайтесь. Принимайте данные по родному клоку, а если нужна синхронизация то синхронизируйте уже готовый байт.
Impartial вне форума  
Непрочитано 03.06.2014, 13:27  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Сообщение от Halex07 Посмотреть сообщение
??? Вообще-то 25 выглядит бинарно, как: 00100101, а у Вас расписано 19.
Калькулятор винды с Вами не согласен, я тоже.
25=00011001
А то что Вы написали - это 37.

Как я понимаю все сходятся на мнении, что проблема в синхронизации?
feo вне форума  
Непрочитано 03.06.2014, 13:50  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Вот так принимать попробуйте.

always @(posedge SCK)
begin
bitcnt ‹= bitcnt + 3'b001;
byte_data_received ‹= {byte_data_received[6:0], MOSI_data};
end
Impartial вне форума  
Непрочитано 05.06.2014, 22:34  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
По умолчанию 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.
feo вне форума  
Непрочитано 06.06.2014, 10:22  
Impartial
Прописка
 
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
Impartial на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Сообщение от feo Посмотреть сообщение
изменил участок кода, начал детектировать по SCK - никакого отличия, все тоже самое.
Ошибка то осталась. Так вообще нет смысла делать.
Сообщение от feo Посмотреть сообщение
if(SCK_risingedge)
Если не владеете верилогом не нужно мудрить. Нарисуйте просто схему в графическом редакторе квартуса.
Impartial вне форума  
Непрочитано 07.06.2014, 19:20  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
По умолчанию Re: Передача данных PIC->MAXII по SPI.

Цитата:
Если не владеете верилогом не нужно мудрить. Нарисуйте просто схему в графическом редакторе квартуса.
Это не совет: не умеешь на верилоге - не пиши на нем.

На данный момент ушел от ошибки тем, что посылаю пакет только по изменению в нем передаваемого значения, а не постоянно.
Пакеты приходят редко, ошибки нет(или просто не вылезает она). Отчего она присутствует при постоянной передаче, так и не выяснил.
feo вне форума  
Непрочитано 26.07.2014, 08:59  
feo
Временная регистрация
 
Регистрация: 30.03.2005
Адрес: Нижний Новгород
Сообщений: 75
Сказал спасибо: 29
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
feo на пути к лучшему
Вопрос Re: Передача данных PIC->MAXII по SPI.

Спасибо всем за советы! Все-таки я добился стабильной передачи данных с пика в плис.
С пика я передаю данные для шим, задача организовать 10 независимых каналов шим в плис, заполнение задается пиком. Т.е. надо передать 10 байт информации.
Но вот загвоздка: стоит мне убрать строку из главного модуля
output wire [39:0]byte_data_received
как мои шим перестают генерироваться.
Господа подскажите в чем может быть ошибка?

ссылка на файлы проекта:
yadi.sk/d/IgTWpxFiXdfYo
feo вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 12:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.