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

 
 
> 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
Ответов
zltigo
сообщение Oct 13 2008, 13:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(vet @ Oct 13 2008, 14:51) *
Что здесь не так?

Не читал, но... - Power, тактировка, выборка...
Для сравнения подобное:
Код
    PCONP = (PCONP & (~PCONP_RESERV))|PCONP_PCSSP1; // Turn On EMC SSP1

    // Configure Pin Connect Block
    PINSEL0_bit.P0_7 = 0x2;           // SCK1
    PINSEL0_bit.P0_8 = 0x2;         // MISO1
    PINSEL0_bit.P0_9 = 0x2;         // MOSI1
    PINSEL0_bit.P_AT45_SSEL = 0x0;  // SSEL1 - Software Control


       FIO0SET =  (P0B_AT45_SSEL|P0B_AT45_RES|P0B_AT45_WP);     // Set Hi (Disabled)
      FIO0DIR |= (P0B_AT45_SSEL|P0B_AT45_RES|P0B_AT45_WP);    // Set ports to output

    // Warning! PClk = CClk  or 1/2 or 1/4
    SSP1CPSR = 2;        // Prescaler/2 = maximum speed
    SSP1CR0 = SSPCR0_DSS(8)|SSPCR0_SCR(1);
      
    for( int i = 0; i < SSP_FIFOSIZE; i++ )
        SSP1DR;            // Clear the RxFIFO

    // Device Enabled and selected as master
    SSP1CR1 = SSPCR1_SSE;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:09
Рейтинг@Mail.ru


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