Доброго дня!
Необходимо управлять матрицей по SPI-протоколу. Так как опыта работы с SPI нет, попробывал метод "в лоб" - использовал программу из Documents/spi с небольшими правками. Проблемы с битностью и скоростью, как кажется, удалось решить, программа возвращает данные. Но возвращает явно не то.
Вопрос - где бы можно было найти примеры работы по SPI-протоколу? А может быть у кого-либо завалялся образчик?
Спасибо.
управление по SPI-протоколу
Модератор: Модераторы разделов
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
IMB
- Сообщения: 2567
- ОС: Debian
Re: управление по SPI-протоколу
На первый взгляд далеко не полный код, но это всё же лучше чем ничего. Посмотрим, глядишь и поспособствует просветлению.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: управление по SPI-протоколу
Посмотрите это, например. Это простенькие утилитки, которые я использовал для изучения протокола управления кэноновским объективом по интерфейсу SPI.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
VAA
- Сообщения: 224
- ОС: Deep Style / Slackware
Re: управление по SPI-протоколу
IMB писал(а): ↑03.03.2011 21:02Доброго дня!
Необходимо управлять матрицей по SPI-протоколу. Так как опыта работы с SPI нет, попробывал метод "в лоб" - использовал программу из Documents/spi с небольшими правками. Проблемы с битностью и скоростью, как кажется, удалось решить, программа возвращает данные. Но возвращает явно не то.
Вопрос - где бы можно было найти примеры работы по SPI-протоколу? А может быть у кого-либо завалялся образчик?
Спасибо.
Оцени задержки между clöck и data, может прийдется сменить полярность clöck (т.е. фронт, по которому опрашиваются данные). Если есть хороший осцилограф - полезно на все это поглядеть. Если со скоростью нормально - то скорее всего проблема - разобраться с временами изменения сигнала в передатчике и моментом приема в приемнике. Между изменениями синхроимпульса и даных надо иметь цоответствующие запасы времени. Временные диаграммы хоть имеются?
В коде разбираться - неблагодарная работа. Нужно представлять работу конкретного железа - протокол не очень жестко стандартизирован. Протокол синхронный, потому не капризный. Просто там, где есть сомнения -оставляй запас по времени. И вобще, начинай с пониженной частоты передачи - потом можно отрегулировать.
Registered Linux user number 436365
-
IMB
- Сообщения: 2567
- ОС: Debian
Re: управление по SPI-протоколу
Тут ещё вопрос в корректности работе драйвера, так как матрицей надо управлять через ARM-процессор. А у производителя, хоть и есть в коде поддержка для SPI, но написана для работы с EEPROM. Так что у меня задача с двумя неизвестными - корректно ли работает драйвер с моими изменениями и корректно ли работает программа с моими изменениями.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: управление по SPI-протоколу
Подключите осциллограф и смотрите осциллограмы.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
IMB
- Сообщения: 2567
- ОС: Debian
Re: управление по SPI-протоколу
Суть проблемы - необходимо управлять матрицей VITA1300 через процессор TexasInstruments TMS320DM365ZCE30 по SPI протоколу.
Особенности VITA1300 - 9 бит на адрес и 16 бит на данные, вся посылка занимает 26 бит.
Особенности TMS320DM365ZCE30 - сдвиговый регистр 16 битный.
Таким образом для пересылки всех моих данных я должен заполнен сдвиговый регистр дважды, но сделать это необходимо во время одной транзакции.
Драйвер с моими отладками и небольшими изменениями:
Вывод из драйвера во время работы:
Видно, что посылаемые данные разбиты на два куска и пишутся поочерёдно.
Для контроля доступности записи в сдвиговый регистр в драйвере предусмотрено следующее:
- проверка 29 бита в регистре SPIBUF, принимает значение 0 когда буфер пуст и запись в сдвиговый регистр возможна
davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0
- вывод значения регистра SPIFLG в котором 9 бит характеризует доступность транспортного буфера, принимает значение 1 при пустом буфере
Как видно из вывода проверка на пустоту буфера проходит, вывод значения SPIFLG это подтверждает.
Но, судя по осцилограффу, вторая часть затирает первую в буфере, на экране осцилограффа я вижу только числа 0x9 и 0x7.
Прикрепил снимки экрана осцилограффа, на более мелком масштабе видно, что посылка занимает ровно 26 бит.
Можете что -либо посоветовать как эту ситуацию исправить на уровне драйвера?
Спасибо.
P.S. Понимаю, что вопрос в основном к производитель, запрос в техподдержку я направил, но все же знают как обычно она нетороплива.
Кстати, изначально изображения были в BMP, но форум их почему то не принимает, пришлось конвертировать в JPG.
Особенности VITA1300 - 9 бит на адрес и 16 бит на данные, вся посылка занимает 26 бит.
Особенности TMS320DM365ZCE30 - сдвиговый регистр 16 битный.
Таким образом для пересылки всех моих данных я должен заполнен сдвиговый регистр дважды, но сделать это необходимо во время одной транзакции.
Драйвер с моими отладками и небольшими изменениями:
Код: Выделить всё
if (t->tx_buf) {
tx_data = davinci_spi->get_tx(davinci_spi);
printk("%s: t->tx_buf\n", __FUNCTION__);
clear_bits(davinci_spi->base + SPIINT, SPI_SPIINT_MASKALL);
printk("%s: SPIINT %#x, SPIFLG %#x\n", __FUNCTION__,
ioread32(davinci_spi->base + SPIINT),
ioread32(davinci_spi->base + SPIFLG));
while (1) {
printk("#############################\n");
data1_reg_val &= ~(0xFFFF);
data1_reg_val |= (0xFFFF & tx_data);
printk("%s: data1_reg_val |= (mask & tx_data) %#x |= (0xFFFF & %#x)\n",
__FUNCTION__, data1_reg_val, tx_data);
buf_val = ioread32(davinci_spi->base + SPIBUF);
printk("%s: buf_val %#x\n", __FUNCTION__, buf_val);
printk("%s: buf_val %#x & SPI_SPIBUF_TXFULL_MASK %#x = %#x\n",
__FUNCTION__, buf_val, SPI_SPIBUF_TXFULL_MASK,
buf_val & SPI_SPIBUF_TXFULL_MASK);
if ((buf_val & SPI_SPIBUF_TXFULL_MASK) == 0) {
iowrite32(data1_reg_val, davinci_spi->base + SPIDAT1);
count--;
}
tx_data >>= 16;
printk("%s: SPIFLG %#x\n", __FUNCTION__,
ioread32(davinci_spi->base + SPIFLG));
if (!count) {
while (ioread32(davinci_spi->base + SPIBUF)
& SPI_SPIBUF_RXEMPTY_MASK)
udelay(1);
/* getting the returned byte */
if (t->rx_buf) {
printk("%s: t->rx_buf\n", __FUNCTION__);
buf_val = ioread32(davinci_spi->base + SPIBUF);
printk("%s: buf_val %#x\n", __FUNCTION__, buf_val);
davinci_spi->get_rx(buf_val, davinci_spi);
}
}
printk("#######################\n");
if (count <= 0)
break;
}Вывод из драйвера во время работы:
Код: Выделить всё
davinci_spi_bufs_pio: t->tx_buf
davinci_spi_bufs_pio: SPIINT 0x0, SPIFLG 0x1000200
#############################
davinci_spi_bufs_pio: tx_data 0x9070440, data1_reg_val 0xfe0000, conv 2, count 2
davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0xfe0440 |= (0xFFFF & 0x9070440)
davinci_spi_bufs_pio: buf_val 0x80ff0000
davinci_spi_bufs_pio: buf_val 0x80ff0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0
davinci_spi_bufs_pio: SPIFLG 0x1000200
davinci_spi_bufs_pio: t->rx_buf
davinci_spi_bufs_pio: buf_val 0x80fe0000
davinci_spi_rx_buf_u32: rx 0x80fe0000
#######################
#############################
davinci_spi_bufs_pio: tx_data 0x907, data1_reg_val 0xfe0440, conv 2, count 1
davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0xfe0907 |= (0xFFFF & 0x907)
davinci_spi_bufs_pio: buf_val 0x80fe0000
davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0
davinci_spi_bufs_pio: SPIFLG 0x1000200
davinci_spi_bufs_pio: t->rx_buf
davinci_spi_bufs_pio: buf_val 0x80fe0000
davinci_spi_rx_buf_u32: rx 0x80fe0000
#######################Видно, что посылаемые данные разбиты на два куска и пишутся поочерёдно.
Для контроля доступности записи в сдвиговый регистр в драйвере предусмотрено следующее:
- проверка 29 бита в регистре SPIBUF, принимает значение 0 когда буфер пуст и запись в сдвиговый регистр возможна
davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0
- вывод значения регистра SPIFLG в котором 9 бит характеризует доступность транспортного буфера, принимает значение 1 при пустом буфере
Как видно из вывода проверка на пустоту буфера проходит, вывод значения SPIFLG это подтверждает.
Но, судя по осцилограффу, вторая часть затирает первую в буфере, на экране осцилограффа я вижу только числа 0x9 и 0x7.
Прикрепил снимки экрана осцилограффа, на более мелком масштабе видно, что посылка занимает ровно 26 бит.
Можете что -либо посоветовать как эту ситуацию исправить на уровне драйвера?
Спасибо.
P.S. Понимаю, что вопрос в основном к производитель, запрос в техподдержку я направил, но все же знают как обычно она нетороплива.
Кстати, изначально изображения были в BMP, но форум их почему то не принимает, пришлось конвертировать в JPG.
У вас нет необходимых прав для просмотра вложений в этом сообщении.