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

 
 
> LPC2378: не работает SPI
vet
сообщение Oct 13 2008, 12:51
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Не поможет ли кто прояснить причину таких вот граблей. Используются ноги: P1.20(SCK0), P1.21(SSEL0, управляется программно), P1.23(MISO0), P1.24(MOSI0). Посылаю в SPI0 байты данных:
Код
#define BIT(n) (1UL<<(n))

void SpiInitHW() {
  //PIO
  PINSEL3_bit.P1_20   = 3; //SCK0
  FIO1CLR             = BIT(20); //low
  FIO1DIR_bit.P1_20   = 1; //output
  PINMODE3_bit.P1_20  = 2; //no pull-up

  PINSEL3_bit.P1_21   = 0; //PIO
  FIO1SET             = BIT(21); //high
  FIO1DIR_bit.P1_21   = 1; //output
  PINMODE3_bit.P1_21  = 2; //no pull-up

  PINSEL3_bit.P1_23   = 3; //MISO0
  FIO1DIR_bit.P1_23   = 0; //input
  PINMODE3_bit.P1_23  = 0; //pull-up (вход выведен на разъём)

  PINSEL3_bit.P1_24   = 3; //MOSI0
  FIO1CLR             = BIT(24); //low
  FIO1DIR_bit.P1_24   = 1; //output
  PINMODE3_bit.P1_24  = 2; //no pull-up

  //SPI
  PCLKSEL0_bit.PCLK_SPI = 1;
  S0SPCCR = 0x80;
  S0SPCR = BIT(5)/*MSTR*/;
}

void SpiSelect()   {FIO1CLR = BIT(21);}
void SpiDeselect() {FIO1SET = BIT(21);}

INT8U SpiTransfer(INT8U data) {
  S0SPDR = data;
  while (!S0SPSR_bit.SPIF);
  return S0SPDR;
}

//.................

  for (;;) {
    WAIT(signalSend); //ждем сигнала на передачу байта
    SpiSelect();
    SpiTransfer(mSend);
    SpiDeselect();
  }


SSEL держит низкий уровень в течение байтового интервала, как задумано; на SCK и MOSI - молчание.
Что здесь не так?


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DimaM
сообщение Oct 14 2008, 10:42
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 17-12-06
Из: село
Пользователь №: 23 615



я тоже только что фунции для spi писал.
вот мои кусочки которые работают

инициализация для LPC2368
Код
    PINSEL0 |= 0xC00A8000;        // CLK; MOSI1, MISO1, CLK1
    PINSEL1 |= 0x0000003C;        // MISO, MOSI;
    FIO0DIR |= (1<<CS_FPGA);        // CS_FPGA
    FIO0SET |= (1<<CS_FPGA);        // CS_FPGA
    FIO0DIR |= (1<<CS_FLASH1);        // CS_FLASH1
    FIO0SET |= (1<<CS_FLASH1);        // CS_FLASH1
    S0SPCCR = 8;    // max freq clock = 6MHz
    S0SPCR = SPI0_MSTR;
    SSP1CR0 = 0x00000007;    // max freq, clk- low defalt, second edge, spi, 8bit  
    SSP1CR1 = 0x00000002;    // SSP Enable, master
    SSP1CPSR = 4;            // max freq

посылка значений
Код
    unsigned int i; unsigned int b;
    FIO0CLR |= (1<<CS_FPGA);
    S0SPDR = adr;
    while ( !(S0SPSR & SPIF) );
    i = S0SPDR;        // Flush the RxFIFO
    S0SPDR = data;
    while ( !(S0SPSR & SPIF) );
    b = (data >> 8);
    S0SPDR = b;
    while ( !(S0SPSR & SPIF) );
    FIO0SET |= (1<<CS_FPGA);
    return i;

или
Код
void Flash1_ReadType(void)
{
    volatile unsigned int i;
    FIO0CLR |= (1<<CS_FLASH1);
    SSP1DR = 0x9F;
    SSP1DR = 0;
    SSP1DR = 0;
    SSP1DR = 0;
//    while ( !(SSP1SR & SSPSR_BSY) );   // SSPSR_TFE SSPSR_RNE
    i = SSP1DR;
    Flash1_ManID = SSP1DR;
    Flash1_MemType = SSP1DR;
    Flash1_MemSize = SSP1DR;
    FIO0SET |= (1<<CS_FLASH1);
}

но что я не понимаю - почему последняя функция выполняется 3.6 us? я вроде и частоту процессора настроил 72 МГц и spi 18МГц.

за сколько должна выполнятся команда MOV ?
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Oct 15 2008, 06:41
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(DimaM @ Oct 14 2008, 14:42) *
Код
    FIO0CLR |= (1<<CS_FPGA);

Странная конструкция. Может вместо"|=" использовать просто "="? И в других аналогичных случаях тоже...
Go to the top of the page
 
+Quote Post
DimaM
сообщение Oct 15 2008, 09:38
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 17-12-06
Из: село
Пользователь №: 23 615



Цитата(Qwertty @ Oct 15 2008, 10:41) *
Странная конструкция. Может вместо"|=" использовать просто "="? И в других аналогичных случаях тоже...

конечно, это я ерунду написал, потому что с ARM недавно работаю. Но SPI и SSP в этих примерах рабочии.
но еще я до сих пор не могу понять сколько время на выполнение команды считать.

Сообщение отредактировал DimaM - Oct 15 2008, 09:39
Go to the top of the page
 
+Quote Post



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

 


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


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