Перейти к содержанию
    

Добрый день!

Пытаюсь записать и прочитать в микросхему 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) видео.

Посмотрите пожалуйста, рабочий ли код?

 

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ха. Тоже учил этот протокол и по этому видео то же =)) Вы его не досмотрели.

Код нужно раскомментировать и переделать. Там где он :

1) i2c_scl меняет с reg на wire,

2) добавляет assign  i2c_scl = ....

и тд

 

Я понял. Вы step 2 не досмотрели

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, Alexey87 said:

досмотрю, код рабочий?

не знаю, но у меня очень похожий. Я свой накидал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, а не проще ли самим разобраться с протоколом I2C и написать собственный модуль Master i2c ? 

Это достаточно простой протокол, который можно изучить за пару дней. Это будет быстрее и проще, чем разбирать чужую реализацию, да ещё и с банальными ошибками...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, Flip-fl0p said:

Господа, а не проще ли самим разобраться с протоколом I2C и написать собственный модуль Master i2c ?

конечно проще

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Flip-fl0p said:

а не проще ли самим разобраться с протоколом I2C

В теории сложного вроде ничего нет.

2 minutes ago, Flip-fl0p said:

и написать собственный модуль Master i2c

а с этим посложнее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, Alexey87 сказал:

В теории сложного вроде ничего нет.

а с этим посложнее...

А что у Вас вызывает сложности ? Не стесняйтесь -  задавайте вопросы. Форум для этого и нужен чтобы помогать, указывать на ошибки, подсказывать как правильно. Для начала начните с бумаги и ручки и нарисуйте блок-схему проекта. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Flip-fl0p said:

А что у Вас вызывает сложности ?

если описать на си или на асме, то нормально и понятно (для меня будет), а на verilog'e не совсем укладывается в голове (это ведь проектирование устр-ва).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Alexey87 сказал:

если описать на си или на асме, то нормально и понятно (для меня будет), а на verilog'e не совсем укладывается в голове (это ведь проектирование устр-ва).

 

К сожалению в этом то и проблема, что verilog - это именно описание аппаратуры, а не программы. Тут я бы посоветовал для начала ознакомиться с набором статей http://www.kit-e.ru/articles/circuit/2009_1_96.php

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, обязательно прочту.

Также приобрёл книги: В.В. Соловьёв "Основы проектирования цифровой аппаратуры Verilog" 2017, Заиналабедин Наваби "Проектирование встраиваемых систем".

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Alexey87 сказал:

Спасибо, обязательно прочту.

Также пробрёл книги: В.В. Соловьёв "Основы проектирования цифровой аппаратуры Verilog" 2017, Заиналабедин Наваби "Проектирование встраиваемых систем".

Настоятельно рекомендую прочитать книгу Уэйкерли Дж.Ф. Проектирование цифровых устройств. Но главное - постепенно изучить язык - и вникнуть в суть синхронного проектирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подключил 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

Изменено пользователем Alexey87

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 или памяти, если защиты от КЗ не предусмотрено....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, Flip-fl0p сказал:

В i2c шине линии SDA и SCL подтянуты к питанию. Передача данных осуществляется за счет того, что устройство, которое обращается к шине "придавливает" линию к нулю, либо "отпускает" линию и таким образом формирует нолики и единички для передачи.

Если неправильно описать  контроллер i2c - то может возникнуть ситуация, когда 2 устройства одновременно пытаются передать данные по шине, при этом FPGA вместо того, чтобы придавливать линию, будут выдавать в эту линию лог.1., в то время как другое устройство "придавливает" её к нулю. А это уже короткое замыкание, которое может повредить FPGA или памяти, если защиты от КЗ не предусмотрено....

В честном I2C сделать "короткое замыкание" нельзя принципиально, поскольку ноль там активный, а единица слабая через подтяжку, тип выходов "открытый коллектор или открытый сток".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...