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

    

SATA2.0 в Virtex5

Отлаживаем SATA контроллер в кристалле Virtex5. Режим работы - SATA2.0 (3Гбита).

 

При коротких пересылках по 1-2 сектора всё работает хорошо. А вот при передачи больших объёмов данных, при блоках больше 4 секторов возникают проблемы:

 

1. Высокий уровень ошибок CRC на шине. На приёме от дисковода - ~2 ошибки на 15Гб, на передаче те же 2, но на 100Мб.

 

2. Зависания шины. Причём на двух разных дисководах это проявляется по разному.

Один в какой-то момент не подтверждает приём данных и далее не реагирует ни на какие команды.

Второй подтверждает приём, но далее также ни на что не реагирует.

 

Выяснили, что всегда (по крайней мере в большинстве случаев) зависанию предшествует передача символа Align во время фазы данных. В спецификации нет никаких запретов на выдачу Align'а. Хотя опытным путём выяснили, что если выравнивание происходит во время старта кадра - шина также виснет. Хорошо, эту ситуацию зарубили. Но что делать с выравниванием во время прохождения обычного тела кадра?

 

Возможно, проблема в линии - вероятно, сбой происходит именно в момент выравнивания и это вешает шину.

 

Подключение по стандартной схеме: на всех линиях стоят конденсаторы 10nF. Все питания в норме. Во всех каналах ситуация одна и та же. Регулировка амплитуды сигнала не даёт толком ничего. PCI-E в этом же кристалле работает без проблем.

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

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


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

Так, с зависаниями шины разобрались - своя глупость. Но по какой причине высокий уровень ошибок CRC, не понятно.

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


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

Я тоже пытаюсь построить контроллер SATA2.0 на отладочной плате ML505 с Virtex5. Жесткий диск Western Digital Caviar Black WD5002AALX.

Запись одного сектора проходит без проблем. Но если попробовать хотя бы 16 секторов одним кадром, то контроллер виснет. Но это по моей вине из-за неправильной обработки прихода примитивов.

 

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

Сначала я думал, что ALIGN отправляется только после CONT, поэтому так построил алгоритм передачи ALIGN со своей стороны. Оказывается, как удалось отследить в чипскопе, винт может отправить ALIGN и без всякого CONT.

 

Надо еще посмотреть, каким образом жесткий диск отправляет ALIGN во время передачи данных со своей стороны.

Со своей стороны я делаю так: ... данные, HOLD, HOLD, CONT, ALIGN, ALIGN, HOLD, данные ... .

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


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

Спасибо. Нашли ошибку: строб спецсимвола выскакивал когда этого не надо. Всё сразу зажило-закрутилось без проблем во всех каналах.

 

Собственно, 8-канальный RAID уже практически готов. )

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


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

Очень интересно, а какая у Вас получилась средняя скорость записи в одном канале? У Вас реализован режим FPDMA?

 

Связываться с реализацией FPDMA я не стал. Пробовал несколько раз записать на HDD блок данных (счетчик) размером 10 ГБ командами DMA по 40 КБ. В процессе записи считал команды, на которые был получен ответ от устройства с ошибкой CRC. Команда с ошибкой CRC повторялась еще раз. Получил в результате, что скорость варьировалась от 60 до 75 МБ/сек, причем чем больше ошибок CRC, тем меньше скорость. Получилось в лучшем случае на каждые 3 МБ приходится одна команда с ошибкой CRC, то есть еще чаще, чем у Вас :biggrin: Чтение с устройства еще не проверял. Ну а причиной ошибок CRC является шум.

 

По ALIGN: устройство может отправить его в любое время, даже может попасть в информационное поле кадра. Значит также можно поступать и с HDD. Последовательность HOLD, CONT, ALIGN в теле кадра я придумал.

 

Не могу понять причину такого поведения: иногда после того, как соединение с устройством установлено, в ответ на все команды записи устройство отвечает ошибками CRC. Потом вообще зависнет все. Делаю сброс, после переподключения команды проходят нормально, связь стабильная по крайней мере несколько часов, больше не проверял. Удачное или неудачное соединение происходит случайно.

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


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

Тоже делаю SATA на Xilinx V5. Столкнулся с проблемой. Есть три HDD разных производителей (Sumsung,Seagete,Western Digital), так вот соединение + получение сигнатуры от HDD могу получить только от Sumsung. С другими HDD соединение устанавливается (принимаю примитивы SYNC) а вот сигнатуру HDD не присылает.

Может кто сталкивался с такой ситуацией, а то уже голову сломал

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


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

vicg

Вы проверяете на прошивке XAPP870? В этой прошивке все время на устройство передается R_RDY.

Если устройство не отвечает кадром после установки соединения, значит, возможно, этот кадр не предусмотрен в данном HDD. :laughing:

 

Мой HDD отвечает этой сигнатурой (правильнее сказать кадром), причем первое dword C38276B9, а в XAPP870 схитрили и написали C28276B9. Если проверить контрольную сумму CRC, то должно быть 3. То есть значение регистра ER = 0x01. После сброса или выполнения команды EXECUTE DEVICE DIAGNOSTIC регистр ER содержит диагностический код. В данном случае 0x01 говорит: Device 0 passed, Device 1 passed or not present.

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


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

Наконец-то разобрался с ошибками CRC.

Оказывается причиной этих ошибок был не шум, а мои косяки в контроллере. Спасибо Eugenius за помощь! :biggrin:

Скорость записи винта HDD выросла до 129 МБ/сек, скорость чтения такая же. Режим последовательной записи/чтения, команды DMA, 40 КБ на одну команду.

SSD Crucial C300 CTFDDAC256MAG-1G1 в тех же условиях выдал 200 МБ/сек на запись и, странно, 170 МБ/сек на чтение.

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


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

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

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

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

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

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

Войти

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

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