Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сброс SPI (Verilog)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
estel23
Добрый день уважаемые, хочу поделиться моей проблемой.

Имеется SPI Slave, вот код:

Код
module SPIslave(
    input wire RESET,
    input wire CSIN,
    input wire SCKIN,
    input wire MOSIIN,
    output wire MISOOUT,
    output reg [15:0] DATAOUT,
    );

reg [15:0] data;
reg [4:0] count;

assign MISOOUT = data[15];

always @ (negedge SCKIN)
    if (RESET & ~CSIN)
        data <= { data[14:0], MOSIIN };
        

always @ (posedge SCKIN)
    if (~RESET | CSIN)
        count <= 5'b00000;
    else
        count <= count + 1'b1;

always @ (count[4])
    DATAOUT <= data

endmodule


Вся проблема в RESETe. Хочу обходиться без лишних ног, ибо на CPLD итак много всего.
Если уберу из кода RESET, то счетчик начинает считать не с начала условий, под которые он подписан.
Т.е. Подаю клок, потом подаю CSIN = 1 (до этого она в нуле). Далее отпускаю CSIN = 0, но счетчик не начинает считать. И только по прошествии 7 - 8 клоков оживает.
Я думал что при включении питания CPLD выставляет все в "0", но получше глянув в Post-моделировании заметил что не все в нуле.

Мож я чет не понимаю? На Verilogе сижу не долго и прошу помощи у экспертов.
EvgenyNik
Мастер-устройство работать с CS будет по словам (т.е. опускаться на 16 бит, а потом подниматься и для передачи следующих 16 бит снова опускаться) или в течении всего пакета будет в нуле, пока посылка не закончится? Если первый вариант, то счётчик Вам вообще не нужен.
По теме, предположу, что смОтрите, например, в Квартусе как post-fitting registers, а т.к. он у Вас внутренний и наружу не выводится, то компилятор представил всё так, как ему удобно.
estel23
Цитата(EvgenyNik @ Sep 9 2015, 19:44) *
Мастер-устройство работать с CS будет по словам (т.е. опускаться на 16 бит, а потом подниматься и для передачи следующих 16 бит снова опускаться) или в течении всего пакета будет в нуле, пока посылка не закончится? Если первый вариант, то счётчик Вам вообще не нужен.
По теме, предположу, что смОтрите, например, в Квартусе как post-fitting registers, а т.к. он у Вас внутренний и наружу не выводится, то компилятор представил всё так, как ему удобно.


Спасибо за ответ. Но счетчик нужен для дальнейшей модификации кода. Некоторые биты информации нужно будет выдергивать, а некоторые вставлять на другое место, и без счетчика никуда.
EvgenyNik
Выведите состояние регистра на внешние пины (как с dataout сделали). Временно. Будете видеть в том виде, в каком привыкли. Потом уберёте за ненадобностью.
Golikov A.
Сдается мне что дело не в ресете.... конечно при наличии CS, RESET не нужен, на первом же клоке счетчик должен уйти в 0, а на следующем с падением CS пойти считать. И тут у меня возникает вопрос клок присутствует до CS? Выдержан ли фронт CS относительно клока, не может быть какой-то метастабильности? Нет ли какого-то выхода на режим всей схемы?

для того чтобы все было в тех состояниях что желаете не поможет ли такой ход?
Код
reg [15:0] data = 0;
reg [4:0] count = 0;


estel23
Цитата(Golikov A. @ Sep 10 2015, 11:07) *
Сдается мне что дело не в ресете.... конечно при наличии CS, RESET не нужен, на первом же клоке счетчик должен уйти в 0, а на следующем с падением CS пойти считать. И тут у меня возникает вопрос клок присутствует до CS? Выдержан ли фронт CS относительно клока, не может быть какой-то метастабильности? Нет ли какого-то выхода на режим всей схемы?

для того чтобы все было в тех состояниях что желаете не поможет ли такой ход?
Код
reg [15:0] data = 0;
reg [4:0] count = 0;


Есть вариант что клок до CS не присутствует. ТАм схема такая: CPLD связана с микросхемой по SPI, та в свою очередь переводит данные из SPI в I2C и обратно. Т.е. так: (FMC-ПОРТ) <-I2C-> (SC18IS602IPW) <-SPI-> CPLD. Но на CPLD еще заведен клок от I2C (наверно постоянный).

Вот собственно мне и нужен SPI-Slave, ток как его сделать.
EvgenyNik
Цитата(estel23 @ Sep 10 2015, 10:42) *
ТАм схема такая: CPLD связана с микросхемой по SPI, та в свою очередь переводит данные из SPI в I2C и обратно. Т.е. так: (FMC-ПОРТ) <-I2C-> (SC18IS602IPW) <-SPI-> CPLD. Но на CPLD еще заведен клок от I2C (наверно постоянный).
Вот собственно мне и нужен SPI-Slave, ток как его сделать.
Ничего не понятно sm.gif Зачем конвертировать SPI<>I2C и обратно? Ну ладно.
У SPI существует несколько режимов работы в плане того - в какой момент выдаются данные и когда их надо захватывать. Т.е. железно сделанный SPI для одного случая, может категорически не подойти для другого.
Например, из вики цитата:
Цитата
Возможны четыре комбинации фазы (CPHA) и полярности (CPOL) сигнала SCLK по отношению к сигналам данных. Режимы работы определяются комбинацией бит CPHA и CPOL:
CPOL = 0 — сигнал синхронизации начинается с низкого уровня;
CPOL = 1 — сигнал синхронизации начинается с высокого уровня;
CPHA = 0 — выборка данных производится по переднему фронту сигнала синхронизации;
CPHA = 1 — выборка данных производится по заднему фронту сигнала синхронизации.

Тактовый импульс I2C в общем случае не является регулярным сигналом. Как именно у Вас - надо смотреть.
estel23
Цитата(EvgenyNik @ Sep 10 2015, 11:55) *
Ничего не понятно sm.gif Зачем конвертировать SPI<>I2C и обратно? Ну ладно.
У SPI существует несколько режимов работы в плане того - в какой момент выдаются данные и когда их надо захватывать. Т.е. железно сделанный SPI для одного случая, может категорически не подойти для другого.
Например, из вики цитата:

Тактовый импульс I2C в общем случае не является регулярным сигналом. Как именно у Вас - надо смотреть.


Конвертация нужна, потому что некоторые микросхемы только по I2C, а некоторые только по SPI (см. рисунок).
Про режимы я вроде разобрался.

И мне нужно реализовать SPI так, как на графиках.
Но для начала я пытаюсь сделать просто сдвиговый регистр. И из возможных пинов есть только 4 под SPI и один клок I2C. И я думаю как сделать сброс если клок не с начала подается, а при передачи информации.
Golikov A.
Множество SPI slave режимов реализуются при асинхронном сбросе по CS. Это как раз по той причине что в 99% случаев клока при CS == 1 нету. Собственно CS в 1 микросхемном варианте и появляется из-за того что надо как-то синхронизовать начальное событие.

Если асинхронный сброс недопустим, то надо заводить клок заведомо большей частоты нежели клок SPI и синхронизироваться по нему.
EvgenyNik
Вариант: выкинуть SC18IS602IPW, подставив вместо неё сразу CPLD и подключить AD9517 и ADC к CPLD не рассматриваете?
Кстати, на режим SPI у ADC смотрели? Он совместим с AD9517? И самое главное - SC18IS602 сможет реализовать SPI, нужный для ADC?
estel23
Цитата(EvgenyNik @ Sep 10 2015, 14:12) *
Вариант: выкинуть SC18IS602IPW, подставив вместо неё сразу CPLD и подключить AD9517 и ADC к CPLD не рассматриваете?
Кстати, на режим SPI у ADC смотрели? Он совместим с AD9517? И самое главное - SC18IS602 сможет реализовать SPI, нужный для ADC?


Дело в том что плата не наша, она куплена. И после некоторых модификаций платы нужно воссоздать управление + дальнейшая доработка кода под наши модификации.
Golikov A.
в CPLD асинхронный сброс возможен?

Код
always @ (posedge SCKIN or posedge CSIN)
    if (CSIN == 1' b1)
        count <= 5'b00000;
    else
        count <= count + 1'b1;
estel23
Цитата(Golikov A. @ Sep 10 2015, 16:26) *
в CPLD асинхронный сброс возможен?

Код
always @ (posedge SCKIN or posedge CSIN)
    if (CSIN == 1' b1)
        count <= 5'b00000;
    else
        count <= count + 1'b1;


Спасибо. Почти заработало.
Точнее не очень почти.

И снова прошу вашей помощи.
Как видно на картинке сверху к MISO подключены сразу три устройства(будем рассматривать CPLD и АЦП), причем изначально CPLD работает когда начальная установка MISO в нуле, а АЦП наоборот, когда начальная установка MISO в единице, причем АЦП все время держит MISO в единице.

Первая мысль - использовать 3-state буфер на выходе CPLD, чтоб в момент выбора MISO опускался и CPLD могла разговаривать по MISO, все остальное время выход в 3-state, а значит в единице, АЦП следит за этим.

Внутри CPLD стоит на стреме регистр с заданными данными (которые к тому же подключены к выходам CPLD - это важно), и как только спадает CS и выбирается CPLD, то данные бегут по MISO. Когда все закончилось, то MISO возвращается в единицу и с ним работает АЦП.

Проверяю я это все дело через нашу прогу. И вроде все работает и данные передаются, и на пинах нужная комбинация с регистра прет.

Но есть косяк:
Если работать через уже включенную прогу, то все норм. Но когда только-только подать питание на плату, то нужные данные в регистре отсутствуют. Смотрел на осциле.
Заливаешь прогу, все есть. Перезагружаешь, ничего нет. Причем все остальное выполняется, и буфер работает, и регистры читаются, но только нули.

В коде единице, у меня нули. Перезаливаю, все норм, перезагружаю - болты.
Golikov A.
Цитата
PLD работает когда начальная установка MISO в нуле, а АЦП наоборот, когда начальная установка MISO в единице, причем АЦП все время держит MISO в единице.

это в корне не правильно. Вам абсолютно все равно должно быть в каком состояние MISO и MOSI, важны сигналы CS - выбор устройства, и фронт клока. По фронту клока мастера каждый слейв должен выставить если он выбран на MISO свое значение, а мастер на MOSI свое. Остальное время пофиг что в каком состоянии

нарисуйте картинку кто у вас мастер и кто слейвы, как они соединены, как идут чипселекты, и схему вашего общения кто там что говорит и какие ноги куда движет...


estel23
Вообщем не могу правильно передавать биты во время начального запуска.

Положение MISO важно, т.к. если я его оставлю без присмотра, то оно упадет в ноль, а дальше идет чтение АЦП, и прочитаются одни нули.

Передача DATA: 00011110
Golikov A.
Цитата
Положение MISO важно, т.к. если я его оставлю без присмотра, то оно упадет в ноль, а дальше идет чтение АЦП, и прочитаются одни нули.

MISO - бит которым управляет СЛЕЙВ!!!! что он поставит то вы и должны как МАСТЕР читать. Что за бред то?
estel23
Цитата(Golikov A. @ Sep 24 2015, 13:30) *
MISO - бит которым управляет СЛЕЙВ!!!! что он поставит то вы и должны как МАСТЕР читать. Что за бред то?


Ды я понимаю что MISO управляет слейв.
Только не получается у меня управлять им.
Вот например: я пишу слейв для CPLD, и после прочтения данных мне как бы на MISO наплевать, что с ним будет делать другой слейв. Но на деле смотрю в осцилл и вижу что когда никаких данных не передается, то слейв в нуле. Но как только пришла очередь АЦП, то она не поднимает сигнал MISO. Т.е. должна передать 00010010, но передаёт 11111111.
Genadi Zawidowski
Выход слейва - MISO - в каждом слейве дожден проходить через tri-state буфер, управляемый CS этого же слейва...
estel23
Цитата(Genadi Zawidowski @ Sep 24 2015, 13:53) *
Выход слейва - MISO - в каждом слейве дожден проходить через tri-state буфер, управляемый CS этого же слейва...


Это все уже сделано)
Genadi Zawidowski
OE буфера не должен ничем стробироваться, просто управляется от чипселекта.
Не понял, а зачем Вам счетчик? Задним фронтом CE защелкиваете на паралельный выход то, что накопилось в сдвиговом регистре за последние 16 тактос CLK. Или у Вашей CPLD на все только один единственный клок?
estel23
Цитата(Genadi Zawidowski @ Sep 24 2015, 14:00) *
OE буфера не должен ничем стробироваться, просто управляется от чипселекта.
Не понял, а зачем Вам счетчик? Задним фронтом CE защелкиваете на паралельный выход то, что накопилось в сдвиговом регистре за последние 16 тактос CLK. Или у Вашей CPLD на все только один единственный клок?


У моей CPLD на все один единственный клок. И тот включается когда передаются данные. А счетчик нужет для того, чтобы из разных регистров CPLD в разные биты записывать и считывать инфу.
А буфер должен выключаться только при наступлении 8 бита, т.к. первые 8 бит - адрес регистра и указатель записи/считывания.
Но я это все уже сделал, и даже работает. Остается вопрос первоначального включения, инициализации CPLD и АЦП, которая не может поднять MISO.

Кстати тип АЦП: EV10AQ190A
EvgenyNik
Цитата(estel23 @ Sep 24 2015, 13:07) *
АЦП, которая не может поднять MISO. Кстати тип АЦП: EV10AQ190A
А Вы подтянули MISO к питанию как сказано в п. 6.6 даташита?
estel23
Цитата(EvgenyNik @ Sep 24 2015, 17:53) *
А Вы подтянули MISO к питанию как сказано в п. 6.6 даташита?


Да, конечно. Дело в том что плата не наша, она куплена. И после некоторых модификаций платы нужно воссоздать управление + дальнейшая доработка кода под наши модификации.
Golikov A.
есть вещи которые я не понимаю и не смогу понять наверное никогда...

если ваша CPLD отпустила линию в 3 состояние, линия подтянута к питанию, то каким образом после этого она остается в 0?
Я думаю у вас какой-то баг с битами, и CPLD не отпускает линию, то есть она не понимает что передача закончилась, и даже поднятый CS ей побоку, что наверное логично если клоки пропадают, то последний бит так и стоит... Я думаю пора привести код, как вы сделали, а то происходит что-то уж совсем непонятное...
estel23
Цитата(Golikov A. @ Sep 24 2015, 23:49) *
есть вещи которые я не понимаю и не смогу понять наверное никогда...

если ваша CPLD отпустила линию в 3 состояние, линия подтянута к питанию, то каким образом после этого она остается в 0?
Я думаю у вас какой-то баг с битами, и CPLD не отпускает линию, то есть она не понимает что передача закончилась, и даже поднятый CS ей побоку, что наверное логично если клоки пропадают, то последний бит так и стоит... Я думаю пора привести код, как вы сделали, а то происходит что-то уж совсем непонятное...


С нулем все впорядке, все поднимается. После долгих мучений я это сделал).
Привожу код программы. Прошу не судить строго, т.к. я не очень силен в Verilogе и написал как смог, и даже почти работает. Т.е. MISO поднимается и данные передаются даже с инверсным клоком, как при начальном включении.

Код
module SPIslave(
     output wire led, //выход
    
    input wire SS_CPLD,
    input wire SCKIN,
    input wire MOSIIN,
    output wire MISOOUT,
     output wire [6:0] REGOUT, //выходные данные
     input wire    [3:0] REGIN    //входные данные
    );
/****************************************************************************/
reg MISO;

reg CS_CPLD;

reg [15:0] data;

reg [3:0]keyneg = 0; //выбор регистра
reg [3:0]keyreg = 0; //выбор регистра

reg [4:0] nBit; //счетчик записи
reg [4:0] rBit; //счетчик чтения

reg [7:0] REG00; //начальная установка синтезатора (да)
reg [7:0] REG01;
reg [7:0] REG02;
// 8'b00011110  ---reg00    
// 8'b01011110  ---reg02

/****************************************************************************/
assign led = SS_CPLD;
assign REGOUT [6:0] = REG00 [6:0];

/****************************************************************************/  
reg tstate = 1;

OBUFT OBUFT_inst (.O(MISOOUT), .I(MISO), .T(tstate)); //буфер 3-state

always @ (negedge SCKIN or posedge SS_CPLD) //управление буфером
    if(SS_CPLD==1)
      tstate = 1;
    else
      if (keyreg [3] == 1)
        tstate = 0;
      else
        tstate = 1;
      
/****************************************************************************/
always @ (negedge SCKIN or posedge SS_CPLD) //счетчик записи
   if(SS_CPLD==1)
      nBit <= 5'b00000;
    else if (SS_CPLD==0)
      nBit <= nBit + 1; //следующий бит

/****************************************************************************/    
always @ (posedge SCKIN or posedge SS_CPLD) //счетчик чтения
   if(SS_CPLD==1)
      rBit <= 5'b00000;
    else if (SS_CPLD==0)
      rBit <= rBit + 1; //следующий бит

/****************************************************************************/    


always @ (posedge SCKIN  or posedge SS_CPLD) //выбор регистра, запись/чтение
begin
   if (SS_CPLD == 1)
      keyreg = 0;
    else
    begin  
      if (nBit == 0)
        begin
         if (MOSIIN == 1) keyreg [0] = 1;
         end
      else
      if (nBit == 6)
        begin
         if (MOSIIN == 1) keyreg [1] = 1;
         end
      else
      if (nBit == 7)
        begin
         if (MOSIIN == 1) keyreg [2] = 1;
            //else
             //if (keyneg [0] == 1) keyneg [3] = 1;  
         end
        
        
        if (rBit == 0)
        begin
         if (MOSIIN == 1) keyreg [0] = 1;
         end
      else
      if (rBit == 6)
        begin
         if (MOSIIN == 1) keyreg [1] = 1;
         end
      else
      if (rBit == 7)
        begin
         if (MOSIIN == 1) keyreg [2] = 1;
            else
             if (keyreg [0] == 1) keyreg [3] = 1;  
         end
        
        
        
      end
end

/****************************************************************************/    
always @ (negedge SCKIN)
    if (SS_CPLD == 0)
        //data <= { data[14:0], 16'b00011110};
          data <= {MOSIIN, data[15:1]};
    
/****************************************************************************/
/****************************************************************************/
//чтение
always @ (negedge SCKIN  or posedge SS_CPLD)
begin
   if (SS_CPLD == 1)
      MISO = 0;
    else
    begin
      if(keyreg [0] == 1)  //бит на чтение
        begin
          case (keyreg)
        4'b1001: begin //reg00
                     case (nBit)
                      7: MISO = REG00[7];
                      8: MISO = REG00[6];
                      9: MISO = REG00[5];
                     10: MISO = REG00[4];
                     11: MISO = REG00[3];
                     12: MISO = REG00[2];
                     13: MISO = REG00[1];
                         14: MISO = REG00[0];
                      default: MISO = 1'bz;
                     endcase
                  end
           4'b1011: begin //reg00
                     case (nBit)
                      7: MISO = 0;
                      8: MISO = 1;
                      9: MISO = 0;
                     10: MISO = !(REGIN[0] & REGIN[1] & REGIN[2] & REGIN[3]);
                     11: MISO = REGIN[3];
                     12: MISO = REGIN[2];
                     13: MISO = REGIN[1];
                         14: MISO = REGIN[0];
                      default: MISO = 1'bz;
                     endcase
                  end
                     default: MISO = 1'bz;
                  endcase
      end
      else MISO = 1'bz;
   end
end            
/****************************************************************************/
/****************************************************************************/    

/****************************************************************************/
/****************************************************************************/                
//запись
always @ (posedge SCKIN)
begin
    if(SS_CPLD == 0)
    begin
      if(keyreg [0] == 0)  //бит на запись
        begin
          case (keyreg)
          4'b0000: begin //reg00
                  case (nBit)
                      8: REG00[7] = MOSIIN;
                      9: REG00[6] = MOSIIN;
                     10: REG00[5] = MOSIIN;
                     11: REG00[4] = MOSIIN;
                     12: REG00[3] = MOSIIN;
                     13: REG00[2] = MOSIIN;
                     14: REG00[1] = MOSIIN;
                         15: REG00[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                  end
          4'b0100: begin //reg01
                  case (nBit)
                      8: REG01[7] = MOSIIN;
                      9: REG01[6] = MOSIIN;
                     10: REG01[5] = MOSIIN;
                     11: REG01[4] = MOSIIN;
                     12: REG01[3] = MOSIIN;
                     13: REG01[2] = MOSIIN;
                     14: REG01[1] = MOSIIN;
                         15: REG01[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                  end
          4'b0010: begin //reg02
                  case (nBit)
                      8: REG02[7] = MOSIIN;
                      9: REG02[6] = MOSIIN;
                     10: REG02[5] = MOSIIN;
                     11: REG02[4] = MOSIIN;
                     12: REG02[3] = MOSIIN;
                     13: REG02[2] = MOSIIN;
                     14: REG02[1] = MOSIIN;
                         15: REG02[0] = MOSIIN;
                      default: MISO = 1'bz;
                     endcase
                        
/*                         //запись в LED
                         if (REG02 == 8'b01000001)
                        led <= REGIN[0];
                      else
                      if (REG02 == 8'b01000010)
                        led <= REGIN[1];
                      else
                      if (REG02 == 8'b01000100)
                        led <= REGIN[2];
                      else
                      if (REG02 == 8'b01001000)
                        led <= REGIN[3];
                 else
                      if (REG02 == 8'b01010000)
                        led <= !(REGIN[0] & REGIN[1] & REGIN[2] & REGIN[3]);
*/                        
                        
                        
                        
                  end
                  endcase
      end
      else MISO = 1'bz;
   end
end
/****************************************************************************/
/****************************************************************************/

endmodule


Led должен смотреть за входящими данными, но я закоментил, и пока на Led выведен только чип селект. Прост к светодиоду подпояться легче, а вся плата - это субмодуль FMC, который стоит в модуле, который установлен в крейт.

Шеф сказал что теперь схемотехники должны тоже делать программную часть, вот и сижу разбираюсь.
Golikov A.
Ох....
Ну если вы схемотехник то вам должно быть знакомо понятие сдвиговые регистры...


Код
if(SS_CPLD==1)
      nBit <= 5'b00000;
    else if (SS_CPLD==0)


else if не надо, это только синтезатор путает. Стандартная конструкция с асинхронным сбросом или установкой

Код
always @(posedge clk or posedge reset)
if(reset == ....)
....
else
....


у вас CS выступает как асинхронный сброс и установка, потому просто else , если бы в блоке был и сброс и установка, else if был бы уместен для приоритетов, а так уберите...



раздел
Цитата
//выбор регистра, запись/чтение
очень сложно написан, у вас вообще одно и тоже по 10 раз в проекте делается
вы представляете что когда вы пишите вот так

Код
case (nBit)
                      8: REG02[7] = MOSIIN;
                      9: REG02[6] = MOSIIN;
                     10: REG02[5] = MOSIIN;
                     11: REG02[4] = MOSIIN;
                     12: REG02[3] = MOSIIN;
                     13: REG02[2] = MOSIIN;
                     14: REG02[1] = MOSIIN;
                     15: REG02[0] = MOSIIN;


вы получаете мультиплексор, который выбирает 1 бит, потом 2, потом 3. При этом у вас еще один мультиплексор прямо сразу по выбору case (keyreg). Иногда синтезатор понимает ваш хитрый план и сам ставить сдвиговые регистры, но иногда это остается мультиплексорами, съедает кучу ресурсов и очень медленно работает... А у вас их еще и 3 независимых может выйти... даже вернее 6, если не 9....


Если хотите можем совместно принести это в порядок по пунктам вам надо написать модуль SPI
который читает и передает 1 байт.
и дальше сделать просто принять байт, по принятому байту выбрать адрес чтения и записи, и еще раз принять или записать байт.





как кстати вы определяете что в данном такте делается, читается или передается?
Как я понимаю другого клока кроме SPI в проекте нет?
estel23
Цитата(Golikov A. @ Sep 25 2015, 11:03) *
как кстати вы определяете что в данном такте делается, читается или передается?
Как я понимаю другого клока кроме SPI в проекте нет?


По данным с COM-порта я вижу какие данные и в какой регистр уходят и приходят, ну и сравниваю с показателями осцилла.


Цитата(Golikov A. @ Sep 25 2015, 11:03) *
Если хотите можем совместно принести это в порядок по пунктам вам надо написать модуль SPI
который читает и передает 1 байт.
и дальше сделать просто принять байт, по принятому байту выбрать адрес чтения и записи, и еще раз принять или записать байт.


А нужно мне сделать обмен по SPI вот этого модуля (см. файл).
Там на 18 странице показана структура, а на 30 странице - регистры.

Я согласен что мой код кривоват, но он по крайней мере передает и принимает правильную информацию.
На рисунке RW - запись/чтение, биты А1, А0 - выбор регистра.




Golikov A.
Цитата
Я согласен что мой код кривоват, но он по крайней мере передает и принимает правильную информацию.

то есть все нормально и вы счастливы?
estel23
Цитата(Golikov A. @ Sep 25 2015, 13:00) *
то есть все нормально и вы счастливы?


Практически да, все норм кроме начала запуска, когда идет инверсный клок, я уже писал про это.
http://electronix.ru/forum/index.php?s=&am...t&p=1367111

Все время данные сдвигаются на один бит влево
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.