Jump to content

    

SATA2.0 в Virtex5

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

 

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

 

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

 

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

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

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

 

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

 

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

 

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

Edited by Eugenius

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this