Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 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,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 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, время: 00:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot