Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Pirpokar
5 / 5 / 2
Регистрация: 24.05.2013
Сообщений: 33
1

VinculumII. Чтение и запись по SPI

02.12.2013, 11:32. Просмотров 1445. Ответов 7
Метки нет (Все метки)

Не так давно устроился на работу, и первым моим микроконтроллером оказался Vinculum II. Мне необходимо организовать высокоскоростной обмен информацией через SPI, для этого я использовал функции API vos_dev_read() и vos_dev_write(). Но они работают очень медленно, для выполнения vos_dev_write(), например, нужно около 500 микросекунд. Мне же необходимо уменьшить это время где-то в 100 раз...

Чуть ниже привожу участок кода, где я использую эти функции

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
while(1)
{
//Ждем когда сработает таймер
tmr_iocb.ioctl_code = VOS_IOCTL_TIMER_WAIT_ON_COMPLETE;
vos_dev_ioctl(hTIMER_UART, &tmr_iocb);
 
/////ЧИТАЕМ С АЦП ////////////////    
//Подключаем 1-ый канал SPI для чтения с АЦП
spim_iocb.ioctl_code = VOS_IOCTL_SPI_MASTER_SS_1;
spim_iocb.set.param = SPI_MASTER_SS_ENABLE;
vos_dev_ioctl(hSPI_MASTER,&spim_iocb);
//Читаем с ADC
vos_dev_write(hSPI_MASTER, ch0, bytesForRead, NULL);
spim_iocb.ioctl_code = VOS_IOCTL_COMMON_GET_RX_QUEUE_STATUS;
vos_dev_ioctl(hSPI_MASTER, &spim_iocb);
if(spim_iocb.get.queue_stat >= bytesForRead)
{
vos_dev_read(hSPI_MASTER, buf, bytesForRead, NULL);
digitRes[0] = buf[1] & 0x0F;
digitRes[1] = buf[2];
}
//Отключаем 1-ый канал SPI
spim_iocb.ioctl_code = VOS_IOCTL_SPI_MASTER_SS_1;
spim_iocb.set.param = SPI_MASTER_SS_DISABLE;
vos_dev_ioctl(hSPI_MASTER,&spim_iocb);  
////////////////////////////////////
 
 
//Отправляем по UART во внешний мир
vos_dev_write(hUART, digitRes, bytesForWrite, NULL);
}
Заранее спасибо! =)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 11:32
Ответы с готовыми решениями:

RTC6715 SPI чтение
Добрый день форумчане! Подскажите, можно ли прочитать с помощью avr по SPI значение регистров...

Чтение байта в режиме SPI 9 битов
Разбираюсь с интерфейсом SPI 9 битов, возник вопрос по чтению из дисплея от Nokia. При записи в...

Чтение SPI->DR в STM32f105
делаю обмен с fpga по SPI. В fpga SPI-Slave реализован так: сначала контроллер передает в 16 битной...

Чтение внешнего АЦП по SPI DMA по таймеру (HAL)
Здравствуйте. Начал изучение STM32 с МК STM32F746. Хотел использовать связку CubeMX + CooCox...

LPC2468: запись SPI-флеш 25P64V6P, какие-то глюки с SSP0DR
Тему обновил! В устройстве есть плата на LPC2468 с SPI-флеш ST25P64V6P. Стал смотреть как в...

7
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
02.12.2013, 12:56 2
...типовое запись-чтение по SPI для FTDI в среде VNC2 IDE Toolchain:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
uint8 IINCHIP_WRITE(uint16 addr,uint8 data)
{
  char spi_buf[]={0xF0};
  char spi_buf1[2];
  char in_buf[4];
  vos_dev_write(hSPIm, spi_buf, 1, NULL);
  spi_buf1[0] = ((addr & 0xFF00) >> 8);
  spi_buf1[1] = (addr & 0x00FF);
  vos_dev_write(hSPIm, spi_buf1, 2, NULL);
  spi_buf1[0] = data;
  vos_dev_write(hSPIm, spi_buf1, 1, NULL);
  return 1;
}
 
 
uint8 IINCHIP_READ(uint16 addr)
{
  common_ioctl_cb_t spim_iocb;
  uint8 data;
  char spi_buf[]={0x0F};
  char spi_buf1[2];
  char *in_buf;
  char in_buf2[1];
  unsigned short dataAvail = 0;
  vos_dev_write(hSPIm, spi_buf, 1, NULL);
  spi_buf1[0] = ((addr & 0xFF00) >> 8);
  spi_buf1[1] = (addr & 0x00FF);
  vos_dev_write(hSPIm, spi_buf1, 2, NULL);
  vos_dev_write(hSPIm, 0x00, 1, NULL); // Формирование тактовых 
импульсов для передачи байта данных от W5100 в управляющий 
контроллер 
 
spim_iocb.ioctl_code = VOS_IOCTL_COMMON_GET_RX_QUEUE_
STATUS;
vos_dev_ioctl(hSPIm, &spim_iocb);
dataAvail = spim_iocb.get.queue_stat;
  if (dataAvail > 1)
   {
    vos_dev_read(hSPIm, in_buf, (dataAvail-1), NULL);
   }
spim_iocb.ioctl_code = VOS_IOCTL_COMMON_GET_RX_QUEUE_
STATUS;
vos_dev_ioctl(hSPIm, &spim_iocb);
dataAvail = spim_iocb.get.queue_stat; 
    vos_dev_read(hSPIm, in_buf2, dataAvail, NULL);
  data = in_buf2[0];
return data;
}
Но они работают очень медленно, для выполнения vos_dev_write(), например, нужно около 500 микросекунд. Мне же необходимо уменьшить это время где-то в 100 раз...
начнем с того, как вы получили это время. Если пока закрыть глаза на код, вы тайминги отмеряли на верхнем уровне в не REALTIME ОС или все же смотрели длительность бита на осциллографе?

Не по теме:

Не так давно устроился на работу, и первым моим микроконтроллером оказался Vinculum II.
где вы такую работу находите? У нас днем с огнем не сыщешь.

1
Pirpokar
5 / 5 / 2
Регистрация: 24.05.2013
Сообщений: 33
02.12.2013, 18:24  [ТС] 3
Спасибо за ответ!

Ну.. работу найти было не сложно, у нас, в нашем маленьком городке, с давних времен работает завод. Зарплата там конечно не высокая, но, пока я еще универ не закончил, так что сойдет =)

Время работы функций чтения/записи замерял осциллографом. Перед тем, как что-то читать я ставил на один из выводов порта А единицу, а сразу после чтения - сбрасывал в ноль. А далее, на осциллографе, смотрел, как долго эта единица стояла. Выходило что-то около 500 микросекунд.

Я вот думаю, быть может, для выполнения чтения/записи лучше использовать не функции API, а вставки на языке Ассемблера? Только я плохо понимаю как это можно организовать, русскоязычной литературы, на эту тему, совсем нет.
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
02.12.2013, 19:54 4
...вы работаете с чипом FTDI через API драйвера производителя, иных способов не существует, разве что, собственно, напишите свой драйвер.

Перед тем, как что-то читать я ставил на один из выводов порта А единицу, а сразу после чтения - сбрасывал в ноль. А далее, на осциллографе, смотрел, как долго эта единица стояла
а вы попробуйте передать пакет данных по SPI и замерьте длительность одного разряда, это будет адекватная проверка.
1
Pirpokar
5 / 5 / 2
Регистрация: 24.05.2013
Сообщений: 33
02.12.2013, 20:18  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
а вы попробуйте передать пакет данных по SPI и замерьте длительность одного разряда, это будет адекватная проверка.
Не совсем понял что вы имеете ввиду. Что значит замерить длительность одного разряда?
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
02.12.2013, 20:23 6
...передаем пакет, к примеру 0xAA, смотрим на осцилле сколько займет времени между двумя фронтами в последовательности 10101010. Ферштеен?
1
Pirpokar
5 / 5 / 2
Регистрация: 24.05.2013
Сообщений: 33
02.12.2013, 20:46  [ТС] 7
Да, хорошо. Завтра попробую и отпишусь =)
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
02.12.2013, 21:02 8
И еще, предварительно стоит поиграться с настройкой портов через vos_iocell_set_config(), четвертый параметр отвечает за крутизну фронтов.
1
02.12.2013, 21:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 21:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по...

SPI на VHDL - чтение
Имеем ПЛИС, подключенную к Raspberry PI по SPI. На самой ПЛИС сделан 8-ми канальный генератор PWM...

Универсальное чтение spi-флешек
Есть ли какие-нибудь универсальные команды чтения которые бы работали на большинстве spi-флешек?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.