lunixoid
Пункты: 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
Пункты: 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):
На любой вопрос есть любой ответ.
lunixoid
Пункты: 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
Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Еще стоило уточнить сразу, что ядро стоит то, что зашивалось "на заводе", не измененное и, может, отсутствие spi в /dev не говорит об отсутствии драйвера в ядре.
дак это надо смотреть - что прописано об SPI в файле борды
вполне может быть, что интерфейс уже "занят" и наколенная софтина с ним конфликтует, например с SPI-GPIO для тачскрина..
а что мешает перекрутить тестовую программу на
SPI1 ? хотя бы "напопробовать"
еще как вариант - отключить все упоминания об
SPI (собственно я это и сделал), пересобрать ядро и загрузить его по сетке через
tftpboot не прошивая в нандфлеш..
На любой вопрос есть любой ответ.
lunixoid
Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
SPI1 уже тоже щупал, результаты те же :(
Сегодня попробую пересобрать ядро.
Jury093
Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
наверно у нас ruki.sys разной сборки..
для SPI0 использованы PB0-PB3. смотрите ревизию свой платы, открываете на нее электросхему, смотрите куда приходят контакты от АРМа на соответствующий разъем. там ДОЛЖЕН быть сигнал..
На любой вопрос есть любой ответ.
lunixoid
Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Пересборка ядра не дала результатов.
Я изначально все проверил по даташиту, ноги PB0-PB3 заведены на ноги 37-40 в Х5 (еще есть на Х2) на плате. Это я всегда и щупал.
P.S. Времени уже мало, может есть под этот контроллер реализация SPI через gpio?
Jury093
Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата Пересборка ядра не дала результатов.
вы проверили - ядро точно обновилось? в файле борды и конфиге ядра вычеркнуты все упоминания о SPI?
Цитата Я изначально все проверил по даташиту, ноги PB0-PB3 заведены на ноги 37-40 в Х5 (еще есть на Х2) на плате. Это я всегда и щупал.
вроде по схеме соответствует..
Цитата P.S. Времени уже мало, может есть под этот контроллер реализация SPI через gpio?
разумеется есть - называется SPI-GPIO, включается в том же меню, где и SPI
скорость обмена будет "никакая", ибо GPIO-based
на форуме он обсуждался..
На любой вопрос есть любой ответ.
lunixoid
Пункты: 1050
Регистрация: 18.01.2012
Пол: Мужчина
Из: Ростов-на-Дону
Ядро обновляется.
Сигнала на spck нет как нет.
Ладно, почти сделал gpio-spi.