Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 (изменено) · Жалоба Добрый день! Пытаюсь записать и прочитать в микросхему 24с04 (память) при помощи этого кода: module Master( input wire clk, input wire reset, output reg i2c_sda, output wire i2c_scl ); //goal is to write to device address 0x50, 0xaa localparam STATE_IDLE = 0; localparam STATE_START = 1; localparam STATE_ADDR = 2; localparam STATE_RW = 3; localparam STATE_WACK = 4; localparam STATE_DATA = 5; localparam STATE_STOP = 6; localparam STATE_WACK2 = 7; reg [7:0] state; reg [6:0] addr; reg [7:0] data; reg [7:0] count; reg i2c_scl_enable = 0; assign i2c_scl = (i2c_scl_enable == 0) ? 1 : clk; always @(negedge clk) begin if (reset == 1) begin i2c_scl_enable = 0; end else begin if ((state == STATE_IDLE) || (state == STATE_START) || (state == STATE_STOP)) begin i2c_scl_enable = 0; end else begin i2c_scl_enable = 1; end end end always @(posedge clk) begin if (reset == 1) begin state <= 0; i2c_sda <= 1; //i2c_scl <= 1; addr <= 7'h50; count <= 8'd0; end else begin case(state) STATE_IDLE: begin // idle i2c_sda <= 1; state <= STATE_START; end STATE_START: begin // start i2c_sda <= 1; state <= STATE_ADDR; count <= 6; end // end state start STATE_ADDR: begin // msb address bit i2c_sda <= addr[count]; if (count == 0) state <= STATE_RW; else count <= count - 1; end // end state addr STATE_RW: begin i2c_sda <= 1; state <= STATE_WACK; end // end state rw STATE_WACK: begin state <= STATE_DATA; count <= 7; end // end state wack STATE_DATA: begin i2c_sda <= data[count]; if (count == 0) state <= STATE_WACK; else count <= count -1; end // end state data STATE_WACK2: begin state <= STATE_STOP; end // state wack2 STATE_STOP: begin i2c_sda <= 1; state <= STATE_IDLE; end // state stop endcase end end endmodule код взят из этого I2C - Bus Master - Step 1 (and step 2) видео. Посмотрите пожалуйста, рабочий ли код? Изменено 8 ноября, 2018 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 (изменено) · Жалоба Ха. Тоже учил этот протокол и по этому видео то же =)) Вы его не досмотрели. Код нужно раскомментировать и переделать. Там где он : 1) i2c_scl меняет с reg на wire, 2) добавляет assign i2c_scl = .... и тд Я понял. Вы step 2 не досмотрели Изменено 8 ноября, 2018 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 2 minutes ago, new123 said: и по этому видео то же досмотрю, код рабочий? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Just now, Alexey87 said: досмотрю, код рабочий? не знаю, но у меня очень похожий. Я свой накидал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Господа, а не проще ли самим разобраться с протоколом I2C и написать собственный модуль Master i2c ? Это достаточно простой протокол, который можно изучить за пару дней. Это будет быстрее и проще, чем разбирать чужую реализацию, да ещё и с банальными ошибками... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 1 minute ago, Flip-fl0p said: Господа, а не проще ли самим разобраться с протоколом I2C и написать собственный модуль Master i2c ? конечно проще Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 2 minutes ago, Flip-fl0p said: а не проще ли самим разобраться с протоколом I2C В теории сложного вроде ничего нет. 2 minutes ago, Flip-fl0p said: и написать собственный модуль Master i2c а с этим посложнее... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 2 минуты назад, Alexey87 сказал: В теории сложного вроде ничего нет. а с этим посложнее... А что у Вас вызывает сложности ? Не стесняйтесь - задавайте вопросы. Форум для этого и нужен чтобы помогать, указывать на ошибки, подсказывать как правильно. Для начала начните с бумаги и ручки и нарисуйте блок-схему проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 4 minutes ago, Flip-fl0p said: А что у Вас вызывает сложности ? если описать на си или на асме, то нормально и понятно (для меня будет), а на verilog'e не совсем укладывается в голове (это ведь проектирование устр-ва). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба 3 минуты назад, Alexey87 сказал: если описать на си или на асме, то нормально и понятно (для меня будет), а на verilog'e не совсем укладывается в голове (это ведь проектирование устр-ва). К сожалению в этом то и проблема, что verilog - это именно описание аппаратуры, а не программы. Тут я бы посоветовал для начала ознакомиться с набором статей http://www.kit-e.ru/articles/circuit/2009_1_96.php Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 (изменено) · Жалоба Спасибо, обязательно прочту. Также приобрёл книги: В.В. Соловьёв "Основы проектирования цифровой аппаратуры Verilog" 2017, Заиналабедин Наваби "Проектирование встраиваемых систем". Изменено 8 ноября, 2018 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 8 ноября, 2018 Опубликовано 8 ноября, 2018 · Жалоба Только что, Alexey87 сказал: Спасибо, обязательно прочту. Также пробрёл книги: В.В. Соловьёв "Основы проектирования цифровой аппаратуры Verilog" 2017, Заиналабедин Наваби "Проектирование встраиваемых систем". Настоятельно рекомендую прочитать книгу Уэйкерли Дж.Ф. Проектирование цифровых устройств. Но главное - постепенно изучить язык - и вникнуть в суть синхронного проектирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey87 0 8 ноября, 2018 Опубликовано 8 ноября, 2018 (изменено) · Жалоба подключил sda на pin_2, scl на pin_4, clk pin_12, не пишет... адрес (slave 24c04) 0x01010000, что неправильно в коде? прикладываю лог с Logic 1.2.18 analyzer. I2C_Logic.logicdata Logic_I2C.zip I2C_Logic.logicdata Logic_I2C.zip Изменено 8 ноября, 2018 пользователем Alexey87 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 9 ноября, 2018 Опубликовано 9 ноября, 2018 · Жалоба 11 часов назад, Alexey87 сказал: подключил sda на pin_2, scl на pin_4, clk pin_12, не пишет... адрес (slave 24c04) 0x01010000, что неправильно в коде? прикладываю лог с Logic 1.2.18 analyzer. I2C_Logic.logicdata Logic_I2C.zip Крайне не рекомендую тестировать в "железе" i2c пока не будут положительные результаты моделирования.... Сначала моделирование - и лишь потом, тестирование в "железе". Только так. Особенно когда берете непроверенный код. В i2c шине линии SDA и SCL подтянуты к питанию. Передача данных осуществляется за счет того, что устройство, которое обращается к шине "придавливает" линию к нулю, либо "отпускает" линию и таким образом формирует нолики и единички для передачи. Если неправильно описать контроллер i2c - то может возникнуть ситуация, когда 2 устройства одновременно пытаются передать данные по шине, при этом FPGA вместо того, чтобы придавливать линию, будут выдавать в эту линию лог.1., в то время как другое устройство "придавливает" её к нулю. А это уже короткое замыкание, которое может повредить FPGA или памяти, если защиты от КЗ не предусмотрено.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladec 10 9 ноября, 2018 Опубликовано 9 ноября, 2018 · Жалоба 36 минут назад, Flip-fl0p сказал: В i2c шине линии SDA и SCL подтянуты к питанию. Передача данных осуществляется за счет того, что устройство, которое обращается к шине "придавливает" линию к нулю, либо "отпускает" линию и таким образом формирует нолики и единички для передачи. Если неправильно описать контроллер i2c - то может возникнуть ситуация, когда 2 устройства одновременно пытаются передать данные по шине, при этом FPGA вместо того, чтобы придавливать линию, будут выдавать в эту линию лог.1., в то время как другое устройство "придавливает" её к нулю. А это уже короткое замыкание, которое может повредить FPGA или памяти, если защиты от КЗ не предусмотрено.... В честном I2C сделать "короткое замыкание" нельзя принципиально, поскольку ноль там активный, а единица слабая через подтяжку, тип выходов "открытый коллектор или открытый сток". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться