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

    

Добрый день!

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

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


Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, new123 said:

и по этому видео то же

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

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


Ссылка на сообщение
Поделиться на другие сайты
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 сделать "короткое замыкание" нельзя принципиально, поскольку ноль там активный, а единица слабая через подтяжку, тип выходов "открытый коллектор или открытый сток".

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация