управление по SPI-протоколу

Взгляд изнутри

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

управление по SPI-протоколу

Сообщение IMB »

Доброго дня!
Необходимо управлять матрицей по SPI-протоколу. Так как опыта работы с SPI нет, попробывал метод "в лоб" - использовал программу из Documents/spi с небольшими правками. Проблемы с битностью и скоростью, как кажется, удалось решить, программа возвращает данные. Но возвращает явно не то.
Вопрос - где бы можно было найти примеры работы по SPI-протоколу? А может быть у кого-либо завалялся образчик?
Спасибо.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: управление по SPI-протоколу

Сообщение serzh-z »

IMB писал(а):
03.03.2011 21:02
Вопрос - где бы можно было найти примеры работы по SPI-протоколу?

http://www.ccsinfo.com/forum/viewtopic.php?t=26801
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: управление по SPI-протоколу

Сообщение IMB »

На первый взгляд далеко не полный код, но это всё же лучше чем ничего. Посмотрим, глядишь и поспособствует просветлению.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: управление по SPI-протоколу

Сообщение eddy »

Посмотрите это, например. Это простенькие утилитки, которые я использовал для изучения протокола управления кэноновским объективом по интерфейсу SPI.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
VAA
Сообщения: 224
ОС: Deep Style / Slackware

Re: управление по SPI-протоколу

Сообщение VAA »

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-протоколу

Сообщение IMB »

Тут ещё вопрос в корректности работе драйвера, так как матрицей надо управлять через ARM-процессор. А у производителя, хоть и есть в коде поддержка для SPI, но написана для работы с EEPROM. Так что у меня задача с двумя неизвестными - корректно ли работает драйвер с моими изменениями и корректно ли работает программа с моими изменениями.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: управление по SPI-протоколу

Сообщение eddy »

IMB писал(а):
04.03.2011 10:21
Так что у меня задача с двумя неизвестными - корректно ли работает драйвер с моими изменениями и корректно ли работает программа с моими изменениями.

Подключите осциллограф и смотрите осциллограмы.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: управление по SPI-протоколу

Сообщение IMB »

Суть проблемы - необходимо управлять матрицей VITA1300 через процессор TexasInstruments TMS320DM365ZCE30 по SPI протоколу.
Особенности 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.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали: