Lomach 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Использую аппаратный SPI. Вот какая проблема: Как сделать чтобы CS можно было устанавливать в 1 или в 0 в зависимости от количества байт, т.е. Иногда нада послать всего 1 байт , а иногда 3 байта, чтобы СS между ними не менялся. CS=0 байт СS=1 CS=0 байт байт байт СS=1 У меня получается такая картина: CS=0 байт CS=1 CS=0 байт CS=1 CS=0 байт СS=1 Как-то это можно сделать используя биты CSAAT и LASTXFER, но как чего-то не пойму. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fantex 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба LASTXFER=0, CSAAT=0, DLYBCT установить в соответствии с требуемой задержкой между передачами байт. Если работа с SPI через PDC, то задержка не требуется. А если через прерывание, то скорее всего надо задавать значение задержки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lomach 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба LASTXFER=0, CSAAT=0, DLYBCT установить в соответствии с требуемой задержкой между передачами байт. Если работа с SPI через PDC, то задержка не требуется. А если через прерывание, то скорее всего надо задавать значение задержки. А как сделать такую вещь: CS=0 байт CS=1 CS=0 байт байт байт CS=1 Это шлется подряд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Управляйте CS через PIO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lomach 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Управляйте CS через PIO. Пробывал так. Почему-то зависает SPI. Управляйте CS через PIO. вот процедуры посылки и приема байта. void SPI_Write(AT91S_SPI *spi, unsigned int npcs, unsigned short data) { while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0); spi->SPI_TDR = data | SPI_PCS(npcs);//| AT91C_SPI_LASTXFER; while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0); } unsigned short SPI_Read(AT91S_SPI *spi) { while ((spi->SPI_SR & AT91C_SPI_RDRF) == 0); return spi->SPI_RDR & 0xFFFF; } Соответственно еще cs управляю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fantex 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Лучше скажите с какой железкой идет обмен по SPI. Здесь люди умные, подскажут как лучше организовать обмен данными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Пробывал так. Почему-то зависает SPI. Не должен. Где зависает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lomach 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Лучше скажите с какой железкой идет обмен по SPI. Здесь люди умные, подскажут как лучше организовать обмен данными. Память FM25256B Не должен. Где зависает? Не могу сказать где. В симуляторе проходит. А в железе-виснет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Не могу сказать где. В симуляторе проходит. А в железе-виснет. Надо разобраться. Свое железо не должно быть черным ящиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 29 апреля, 2011 Опубликовано 29 апреля, 2011 (изменено) · Жалоба Не должен. Где зависает? У коллеги, скорее всего, не выставлен бит MODFDIS - без него в ошибки сваливается при управлении чипселктами в рукопашную. А готовность, кажется, при этом не появляется. Использую аппаратный SPI. Вот какая проблема: Привели бы код инициализации - быстрее бы всё решилось. Память FM25256B Пятивольтовая? Изменено 29 апреля, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lomach 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба У коллеги, скорее всего, не выставлен бит MODFDIS - без него в ошибки сваливается при управлении чипселктами в рукопашную. А готовность, кажется, при этом не появляется. Привели бы код инициализации - быстрее бы всё решилось. Пятивольтовая? Вот собственно и вся инициализация : PIO_Configure(pinsSPI0, PIO_LISTSIZE(pinsSPI0)); SPI_Configure(AT91C_BASE_SPI0,AT91C_ID_SPI0,AT91C_SPI_MSTR); SPI_ConfigureNPCS(AT91C_BASE_SPI0,0,AT91C_SPI_SCBR); SPI_Enable(AT91C_BASE_SPI0); PIO_Configure(&CS, 1); PIO_Configure(&HOLD, 1); PIO_Set(&HOLD); Микросхема пятивольтовая, но питаю от 3.3 В. Программный SPI работает, поэтому думаю и аппаратный должен тоже работать. TWI аппаратный с глюками но работает при питании переферрии от 3.3 В. Т.е. и SPI должен тоже работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться