МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Передача данных PIC->MAXII по SPI.

Передача данных PIC->MAXII по SPI. 4 года 5 мес. назад #2635

  • feo740
  • feo740 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 3
  • Спасибо получено: 0
Господа, пытаюсь передать байт из пика в 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 осталось), вертикальные линии это моменты приема пакета. Мы видим, чо большую часть времени в регистре правильное значение, но временами некоторые биты переходят в неправильное значение.
Сами передаваемые данные не раз проверял тем же логическим анализатором, все отсылается и на пины плис приходит как по учебнику.

Прошу совета, в чем же может быть ошибка
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Передача данных PIC->MAXII по SPI. 4 года 5 мес. назад #2636

А реально частота "SCK" какая? Уменьшать не пробовали?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Передача данных PIC->MAXII по SPI. 4 года 5 мес. назад #2637

  • feo740
  • feo740 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 3
  • Спасибо получено: 0
20мГц, уменьшить возможности нет. :unsure:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Передача данных PIC->MAXII по SPI. 4 года 5 мес. назад #2639

feo740 пишет: 20мГц, уменьшить возможности нет. :unsure:

Как одна из версий, из-за маленькой разницы в клоках и наличия схемы согласования (а она влияет на скважность), пропускаются такты.
С какой частотой вы можете смотреть анализатором? Ширина ноликов и единичек у "SCK" одинаковая?
Выхода два, или повышать тактовую на ПЛИС, или повышать напряжение на максе (до 4.2в) и убирать схему согласования.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Передача данных PIC->MAXII по SPI. 4 года 3 мес. назад #2709

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

ссылка на файлы проекта:
yadi.sk/d/IgTWpxFiXdfYo

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Передача данных PIC->MAXII по SPI. 4 года 1 мес. назад #2779

расскажу о своем опыте\выявленной весьма похожей и решеной проблеме с ep4ce6 взаимодействующим с микроконтроллером avr atmega8 по spi. Спи мастер на микроконтроллере.
Изначально пошел по вашему пути, скачал исходник верилога, (кстати такое же что вы и продемонстрировали, он не самый оптимальный). Работает, но периодически *и так очень прилично периодически* глючит. Думал\гадал, в общем оказалось, что бага в микроконтроллере, а точнее в том, что микроконтроллер ставит не стабильный SCLK!!! что это значит? а вот примерно следующее, предположим ожидается переход с земли на + для SCLK, так он может подняться до +, потом на мгновение сброситься опять до 0, а потом подняться и уже быть стабильным. Тк фпга работает на частоте превышающей SPI частоту микроконтроллера (в моем случае фпга на 50 мхз, а спи на микроконтроллере на 125 килогерцах!), те разница в разы, фпга может словить увеличение для SCLK, потом падение для SCLK, а потом опять рост, те получается фпга ловит левые\лишние биты из за не стабильности сигнала с микроконтроллера, в результате примется\отправится фэйк по спи.

Как не правильно фиксить? понижать\повышать частоту на фпга\микроконтоллере - не правильно!!! Да, вероятность баги будет ниже, но клоки также не защищены и может воспроизвестись выше описанная мной ситуация.
Как правильно фиксить? нужно сделать буфер для клока (у меня бит так на 8 ), пока этот буфер на 100% не заполнится стабильным сигналом, и только потом задействовать SCK_risingedge\SCK_fallingedge. Надеюсь, я доступно отписал. После осознания этой фичи - у меня все как часы стало работать.
Спасибо сказали: alman

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от shchekoldin.
  • Страница:
  • 1
Время создания страницы: 0.146 секунд

facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Передача данных PIC->MAXII по SPI.