Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
spi mmap
lunixoid
Добавлено 14.03.2012 12:02 Редактировалось 14.03.2012 12:57 Сообщение: 11
lunixoid
0

Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Регистр SPI_MR при первоначальном конфигурировании:
MSTR = 1;
PS = 0;
PCSDEC = 0;
MODFDIS = 0;
LLB = 0;
PCS = 0xF;
Потом включаю SPI - регистр SPI_CR:
SPIEN = 1, остальное 0;
Регистр SPI_CSR0:
CPOL = 0;
NCPHA = 0;
CSAAT = 0;
BITS = 0000;
SCBR = 0x6;
DLYBS = 0x6;
DLYBCT = 0x6;

Во время записи в регистре SPI_MR меняю содержимое PCS:
PCS &= ~(1 << 16);
При выводе дампа регистра SPI_MR после конфигурирования непосредственно получаю все, что описал выше, при записи изменяется только PCS:
PCS = 1110; (ну так и должно быть)

Дамп SPI_SR сразу после включения SPI (в десятичной форме = 66290):
RDRF = 0;
TDRE = 1;
MODF = 0;
OVRES = 0;
потом 4 бита зарезервированных = 1111;
NSSR = 0;
TXEMPTY = 1;
зарезервированные биты установлены в 0;
SPIENS = 1;
зарезервированные биты установлены в 0;

В функции записи сразу после проверки
Код
while ( (spi_regs->SPI_SR & 0x1 << 9) == 0 );
точно такой же дамп SPI_SR.
В цикле
Код
while ( (spi_regs->SPI_SR & 0x1 << 1) == 0 );
дамп SPI_SR = 65776:
TDRE = 0;
TXEMPTY = 0;
все остальные биты такие же как после включения SPI.

Непонятно почему SPCK молчит как рыба :(
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 15.03.2012 00:03 Сообщение: 12
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
ищите, где у вас ошибка. компилировал прямо на слабоработающем 9m10 (братец 9g45):
Код
/* spi test by jury093 */

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

#define PIO_PDR 0x04
#define PIO_OER 0x10 // may be not need
#define PIO_ASR 0x70


#define SPI_CR 0x00 // Control Register
#define SPI_MR 0x04 // Mode Register
#define SPI_RDR 0x08 // Receive Data Register
#define SPI_TDR 0x0c // Transmit Data Register
#define SPI_SR 0x10 // Status Register
#define SPI_IER 0x14 // Interrupt Enable Register
#define SPI_IDR 0x18 // Interrupt Disable Register
#define SPI_IMR 0x1c // Interrupt Mask Register
#define SPI_CSR0 0x30 // Chip Select Register

#define PMC_PCER 0x10
#define PMC_PCSR 0x18

#define spibase 0xfffa4000
#define pmcbase 0xfffffc00
#define gpiobase 0xfffff400
#define base1 (spibase)
#define base2 (pmcbase)
#define base3 (gpiobase)

void *base_spi;
void *base_pmc;
void *base_gpio;

int main(void)
{
//Задаем размер карты
unsigned long map_size = 4096Ul;
unsigned long map_mask = map_size - 1;
unsigned long stat;
int fd;
// try open /dev/mem ===============================================
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
{
printf("Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
printf("/dev/mem opened.\n");

base_gpio = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, base3 & ~map_mask);

if (base_gpio == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
base_gpio+=(base3 & map_mask);
printf("GPIO memory block mapped at address %p.\n", base_gpio);

*(int*)(base_gpio+PIO_OER) = 0x0000000e; // gpio mode out
*(int*)(base_gpio+PIO_PDR) = 0x0000000f; // disable gpio mode
*(int*)(base_gpio+PIO_ASR) = 0x0000000f; // pb0-pb3 alternative A

base_pmc = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, base2 & ~map_mask);

if (base_gpio == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
base_pmc+=(base2 & map_mask);

printf("PMC memory block mapped at address %p.\n", base_pmc);

*(int*)(base_pmc+PMC_PCER) = 0x00004000; // spi clk enable
stat = *(int*)(base_pmc+PMC_PCSR);
printf("Status reg SR=%08x\n", stat);

base_spi = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, base1 & ~map_mask);

if (base_spi == (void *) -1)
{
printf("Memory mapping error.\n");
exit(EXIT_FAILURE);
}
base_spi+=(base1 & map_mask);
printf("SPI memory block mapped at address %p.\n", base_spi);

*(int*)(base_spi+SPI_CR) = 0x00000001; // spi enable
printf("SPI enable\n");
stat = *(int*)(base_spi+SPI_SR);
printf("Status reg SR=%X\n", stat);

*(int*)(base_spi+SPI_MR) = 0x000e0001; // mode master
*(int*)(base_spi+SPI_CSR0) = 0x0000ff00; // mode chip select0

*(int*)(base_spi+SPI_TDR) = 0x000e0000; // ncs0
*(int*)(base_spi+SPI_TDR) = 0x0000005a; // send data
stat = *(int*)(base_spi+SPI_SR);
printf("Status reg SR=%X\n", stat);

close(fd);
printf("nice work, bye!\n");
return 0;
}

щупы на MOSI(pb1) и CLK(pb2):
title

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
lunixoid
Добавлено 15.03.2012 10:52 Редактировалось 15.03.2012 22:54 Сообщение: 13
lunixoid
0

Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Осцилл все равно молчит.
Выходит, проблема не в коде.

Забыл сразу добавить:
Код
/mnt/sda1 # ./spi_test
GPIO memory block mapped at address 0x40103400.
PMC memory block mapped at address 0x40176c00.
Status reg SR=02e0c03c
SPI memory block mapped at address 0x402df000.
SPI enable
Status reg SR=103FB
Status reg SR=100F1
nice work, bye!


Еще стоило уточнить сразу, что ядро стоит то, что зашивалось "на заводе", не измененное и, может, отсутствие spi в /dev не говорит об отсутствии драйвера в ядре.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 15.03.2012 23:13 Сообщение: 14
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Еще стоило уточнить сразу, что ядро стоит то, что зашивалось "на заводе", не измененное и, может, отсутствие spi в /dev не говорит об отсутствии драйвера в ядре.

дак это надо смотреть - что прописано об SPI в файле борды
вполне может быть, что интерфейс уже "занят" и наколенная софтина с ним конфликтует, например с SPI-GPIO для тачскрина..

а что мешает перекрутить тестовую программу на SPI1? хотя бы "напопробовать"

еще как вариант - отключить все упоминания об SPI (собственно я это и сделал), пересобрать ядро и загрузить его по сетке через tftpboot не прошивая в нандфлеш..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
lunixoid
Добавлено 16.03.2012 08:20 Сообщение: 15
lunixoid
0

Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
SPI1 уже тоже щупал, результаты те же :(
Сегодня попробую пересобрать ядро.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.03.2012 09:59 Сообщение: 16
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
наверно у нас ruki.sys разной сборки..
для SPI0 использованы PB0-PB3. смотрите ревизию свой платы, открываете на нее электросхему, смотрите куда приходят контакты от АРМа на соответствующий разъем. там ДОЛЖЕН быть сигнал..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
lunixoid
Добавлено 16.03.2012 12:25 Редактировалось 16.03.2012 12:26 Сообщение: 17
lunixoid
0

Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Пересборка ядра не дала результатов.

Я изначально все проверил по даташиту, ноги PB0-PB3 заведены на ноги 37-40 в Х5 (еще есть на Х2) на плате. Это я всегда и щупал.

P.S. Времени уже мало, может есть под этот контроллер реализация SPI через gpio?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.03.2012 12:40 Сообщение: 18
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Пересборка ядра не дала результатов.

вы проверили - ядро точно обновилось? в файле борды и конфиге ядра вычеркнуты все упоминания о SPI?

Цитата
Я изначально все проверил по даташиту, ноги PB0-PB3 заведены на ноги 37-40 в Х5 (еще есть на Х2) на плате. Это я всегда и щупал.

вроде по схеме соответствует..

Цитата
P.S. Времени уже мало, может есть под этот контроллер реализация SPI через gpio?

разумеется есть - называется SPI-GPIO, включается в том же меню, где и SPI
скорость обмена будет "никакая", ибо GPIO-based
на форуме он обсуждался..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
lunixoid
Добавлено 16.03.2012 13:15 Сообщение: 19
lunixoid
0

Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Ядро обновляется.
Сигнала на spck нет как нет.

Ладно, почти сделал gpio-spi.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux