реклама на сайте
подробности

 
 
> AT91SAM7X SPI PDC SD-card
Колька
сообщение Sep 22 2009, 14:42
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 22-09-09
Пользователь №: 52 517



Написал свою библиотеку по работе с SD-card. Все работает замечательно. Но есть одно "но". Отправку, прием я сделал без PDC.
Когда мне нужно принять 512 байт, я просто побайтно их последовательно принимаю. Проблема в следующем: настраиваю PDC и в результате приходит "каша". CS-ом дергаю сам. Никто не подскажет в чем может быть проблема? Скорость понижал не помогло. В общем буду рад любому совету.

Сообщение отредактировал Колька - Sep 22 2009, 14:44
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Колька
сообщение Sep 22 2009, 17:11
Сообщение #2





Группа: Участник
Сообщений: 7
Регистрация: 22-09-09
Пользователь №: 52 517



Функция блочного считывания:
Код
uint8_t datablock_read(uint8_t* buff, uint32_t btr) {
  uint8_t token;

  uint32_t time = OSTime;

  while (1) {
    token = SPI_Read(0xFF);
    if (token != 0xFF)
      break;
    if ((OSTime - time) > 100)
      break;
  }

  if (token != 0xFE)
    return 0;

  #if USE_DMA        
    SPI_Read_PDC(buff, btr);
  #else
    do {
      SPI_Read(buff++);
    } while (btr -= 1);
  #endif
  SPI_Read(0xFF);
  SPI_Read(0xFF);

  return 1;
}

***** *

unsigned short SPI_Read(PSPI self, unsigned short data) {

  while ((BASE_SPI->SPI_SR &AT91C_SPI_TDRE) == 0)
;

  self->BASE_SPI->SPI_TDR = (data &0xFFFF);


  while (0 == (self->BASE_SPI->SPI_SR &AT91C_SPI_RDRF))
;

  return ((self->BASE_SPI->SPI_RDR) &0xFFFF);
}


short SPI_Read_PDC(PSPI self, void* data, unsigned short count) {

  self->BASE_SPI->SPI_RDR;
  self->BASE_SPI->SPI_SR;

  self->BASE_SPI_PDC->PDC_RPR = (unsigned int)data;
  self->BASE_SPI_PDC->PDC_RCR = count;

  self->BASE_SPI_PDC->PDC_PTCR = AT91C_PDC_RXTEN;
  self->BASE_SPI->SPI_IER = (AT91C_SPI_ENDRX);

  if (SPI_Send_PDC(self, dma_dummy, count) == count) {
    xSemaphoreTake(self->RXSemaphore, timeout);
  }

  self->BASE_SPI->SPI_IDR = AT91C_SPI_ENDRX;
  self->BASE_SPI_PDC->PDC_RCR = 0;

  (unsigned long)self->BASE_SPI->SPI_SR;
  (unsigned long)self->BASE_SPI->SPI_RDR;

  self->BASE_SPI_PDC->PDC_PTCR = AT91C_PDC_RXTDIS;

  unsigned short res = count - (self->BASE_SPI_PDC->PDC_RCR);

  return res;
}


dma_dummy - масив с 0xFF значениями. SPI_Send_PDC - запись, один в один такая же как и чтение, кроме регистров иннициализации отправки, а логика такая же поэтому не привожу.
Коэффициент деления: 2, при иннициализации 200. Параметры: AT91C_SPI_CPOL | AT91C_SPI_BITS_8

В общем при "#define USE_DMA 0" работает, а при "#define USE_DMA 1" нет sad.gif
Где ошибка у меня ошибка? Не подскажите?

Сообщение отредактировал Колька - Sep 22 2009, 17:16
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 22 2009, 19:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Колька @ Sep 22 2009, 21:11) *
SPI_Send_PDC - запись, один в один такая же как и чтение, кроме регистров иннициализации отправки, а логика такая же поэтому не привожу.

Напрасно, ибо вот это абсолютно не понятно:
Код
  if (SPI_Send_PDC(self, dma_dummy, count) == count) {
    xSemaphoreTake(self->RXSemaphore, timeout);
  }

Кто, где, когда и при каких условиях это семафор ставит?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 13:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016