Добрый день!
Пытаюсь реализовать I2S на SAM3U, причем проц. должен работать как slave. Прежде всего хочу отметить что в описании на slave mode есть ошибки.
1.Бит SVREAD регистра TWI_SR говорит об направлении (прием\передача). лог.1-чтение мастером, лог 0-запись мастером, что вытекает из описания битов регистра TWI_SR(стр.656). На рисунке 33-32, стр. 661. наоборот.
2. Бит RXRDY регистра TWI_SR говорит о состоянии приемника. лог 1- был принят байт в регистр приемника TWI_RHR, после последнего чтения, лог 0- не был принят байт в регистр приемника TWI_RHR, после последнего чтения. На рисунке 33-32, стр. 661. опять же наоборот.
Но ошибки это не главное, чудеса начинаются после запуска.
После того как был принят свой адрес, направление передачи "R"-чтение, sam3u посылает ASK-это нормально, и я должен положить байт в регистр передачи TWI_THR. Я так и делаю, но в зависимости от значения байта, мой SAM3U(slave) либо отпускает линию SDA или нет - а вот это уже странно.
Как вообще slave может удерживать линию SDA?
Судите сами.
(адрес slave -10)
1 картинка- после ASKа загружаю 0xFF. sam3u отпускает шину SDA - нормально. Далее мастер формирует ПОВСТАРТ и СТОП-условие
receive_FF.bmp ( 19 килобайт )
Кол-во скачиваний: 172 картинка- после ASKа загружаю 0x01. sam3u не отпускает шину SDA- не понятно. Далее мастер пытается сформировать СТОП, но Sam3u пытается удерживать линию SDA в нуле.
receive_01_first.bmp ( 18.54 килобайт )
Кол-во скачиваний: 143 картинка для информации, что происходит после 2 картинки, когда линия SDA в каком-то непонятном состоянии.
receive_01_second.bmp ( 18.51 килобайт )
Кол-во скачиваний: 8А теперь главный вопрос, кто виноват и что делать? Я готов написать в ATMEL, но хотелось бы услышать, мнения форумчан.
Может где-то мой косяк зарыт? Код перекраивал много раз, итог один.