этот вопрос, вероятно, не очень хорошо объясним, и это потому, что я не совсем понимаю, что происходит в моем дизайне.
Мне нужно использовать коммуникационную шину I2C для связи с камерой (Terasic D5M), поэтому я попытался написать ее с помощью Verilog. Мне нужен только мастер. На моем логическом анализаторе все выглядит отлично, за исключением того, что я продолжаю получать сигналы NACK от камеры. Сначала я понятия не имел, что случилось, поэтому просто отложил это в сторону.
Сегодня вечером я попытался использовать IP ядро Университета Альтера, в котором есть модуль для D5M. После настройки автоматической инициализации я наблюдал за тем, что происходит на моем анализаторе. Трассировка выглядит так же, как вывод из моего модуля I2C, за исключением того, что устройство регистрирует ACK.
Моя проблема в том, что я не могу понять, почему я не получаю подтверждения. Возможно, я не позволяю камере тянуть линию sda на низком уровне (scl работает нормально), но я не могу понять, почему это так.
У кого-нибудь есть подобный опыт или есть идеи, куда мне обратиться, посмотреть / опубликовать / прочитать? Я бы опубликовал некоторый код, но я не знаю, насколько он будет полезен, если он не полностью. Извините за то, что я такой расплывчатый, но я действительно потерян и даже не знаю, о чем должен спрашивать; Я думаю, что это аналогичный эффект запроса. Спасибо за любую помощь, вот немного кода для строк вывода из модуля i2c.
`define HIGH 1'bZ
`define TRUE 1'b1
`define FALSE 1'b0
inout sda;
assign sda = (ena_sda)?sda_bit:`HIGH;
inout scl;
assign scl = (ena_scl)?pSCL:`HIGH;
pSCL - это часы, которые работают с желаемой частотой, а sda_bit - это значение линии sda во время работы. Вот раздел, который выпускает и ждет подтверждения. Это встроено в мое состояние смещения, отсюда и начало, если.
// Data shifting complete, check for ACK
// Release the SDA line and set our bit to high Z
else if(shiftComplete == `TRUE) begin
ena_sda = `FALSE;
sda_bit = `HIGH;
if(negedge_SCL) begin
ena_sda = `TRUE;
case(i2cState)
`DATA_STATE:
begin
shiftComplete = `FALSE;
nxState = `DATA_STATE;
end
`START_STATE: nxState = `REPEAT_START_STATE;
default: nxState = `STOP_STATE;
endcase
end
end /* end ACK */
Я бы подумал, что выпуска ena_sda будет достаточно, чтобы позволить камере управлять модулем. Я думаю, что я поставил sda_bit = HIGH перед тестом (я не смотрел на это в течение месяца).
Я был бы рад поделиться большим количеством кода или показать свои логические следы, но я не хочу больше загромождать это. Спасибо за чтение.