hermit2008
May 5 2008, 15:46
Уже достаточно долго пытаюсь завести SPI на данном контроллере. Может подскажите что не так.
void spiInit(void)
{
// Select PIN
PINSEL0 &= ~0xFF00; // 0xFF00 for SSEL0
PINSEL0 |= 0x5500; // 0x5500 for SSEL0
// set SPI rate
S0SPCCR = 64;
// set master mode, clock polarity and phase
S0SPCR = (1<<SPCR_MSTR);
}
unsigned char spiTransferByte(unsigned char data)
{
// write SPI data
S0SPDR = data;
// wait until SPI transfer completes
while(!(S0SPSR & (1<<SPSR_SPIF)));
}
// чтение ID flash памяти M25P64
unsigned short spiflashGetID(void)
{
unsigned short id;
spiTransferByte(SPIFLASH_CMD_RDID);
id = spiTransferByte(0x00)<<8;
id |= spiTransferByte(0x00);
return id;
}
void test1()
{
spiInit();
// бесконечный цикл чтения ID для снятия осцилограммы
int i = 0;
while (1){
spiflashGetID();
}
}
Проблемка в том что на осцилограмме пин CLK0 не наблюдается никаких импульсов.
Если подозрения на SSEL0, он видит не задействованным. Пробовал подвоить к нему 3.3 вольта. как пишут на сайте NXP, результат такой же.
Выдержка с NXP.
Q I am using the SPI in only the master mode. Hence, I mapped MOSI and SCLK to the respective port pins. Why don't I see any output?
A This only occurs with our LPC2104/2105/2106, LPC2114/2124, LPC2214/2224, LPC2119/2129/2292/2294/2194, and LPC2210/2290 microcontrollers. When you are using the SPI in master mode with these devices, you also need to map SSEL pin to P0.7 and drive it high. You do not need to map the MISO pin.
Работаю с SPI первый раз, поэтому буду благодарен за любую помощь и советы.
Если у кого есть исходники с работой SPI с памятью M25P64 и подобными или просто любые самплы.
defunct
May 6 2008, 01:49
Код
void spi_hw_test(void)
{
IODIR0 &= ~(pinSCK | pinMOSI | pinMISO | pinSSEL); // remove all SPI pins output selection
IODIR0 |= pinSCK | pinMOSI; // select output for SCK / MOSI
PINSEL0 |= 0x00005500; // assign SPI0 peripheral to SPI pins (including SSEL)
S0SPCCR = 254; // divisor
S0SPCR = (1 << SPCR_MSTR);
for(;;)
{
IOCLR0 = pinGENERIC_CS; // select generic part
S0SPDR = 0x57; // do SPI transfer
while ( S0SPSR != 0x80); // wait until transfer complete
IOSET0 = pinGENERIC_CS; // unselect part
printf("SPDR = %x\n", S0SPDR);
}
}
SSEL0 обязательно подтянуть к +3.3!
hermit2008
May 6 2008, 13:25
Действительно помогло.
Благодарю
hermit2008
Sep 14 2008, 21:07
Не могу переключиться из SP1 в SSP.
Подскажите что не так делаю.
// Запрещаем все прерывания
__ARMLIB_disableIRQ();
__ARMLIB_disableFIQ();
// Считываю начальное значение
unsigned int val0 = PCONP;
// Устанавливаем биты SSP=1, SP1=0
unsigned int val_new = (PCONP & (~((unsigned int)(1<<10)))) | (1<<23);
// Записываем
PCONP = val_new;
// Считываем
unsigned int val1 = PCONP;
Результат такой:
val0 = 0x00007bbe // было
val_new = 0x00807bbe // должно быть
val1 = 0x00007bbe // ничего не изменилось (??)
В доке на PCONP сказано:
bit 23 : PCSSP The SSP interface power/clock control bit
Remark: Setting this bit to 1 and bit 10 (PSPI1) to 0, selects the SPI1
interface as SSP interface. At reset, SPI1 is enabled.
zltigo
Sep 14 2008, 21:50
Цитата(hermit2008 @ Sep 14 2008, 23:07)

Не могу переключиться из SP1 в SSP
У LPC2129 SSP просто нет. У LPC2129/01 только.
hermit2008
Sep 15 2008, 08:08
Цитата(zltigo @ Sep 15 2008, 01:50)

У LPC2129 SSP просто нет. У LPC2129/01 только.
Да у меня LPC2129/01. Проблема еще осталась. Может у кого есть примеры инициализации SSP на этом мк. Буду благодарен.
zltigo
Sep 15 2008, 08:30
Цитата(hermit2008 @ Sep 15 2008, 10:08)

Да у меня LPC2129/01.
По описанным симптомам это не так. Или описание симптома нечитабельности PCONP неправильное, или...
MikePic
Sep 22 2008, 09:17
Цитата(hermit2008 @ Sep 15 2008, 01:07)

Не могу переключиться из SP1 в SSP.
Подскажите что не так делаю.
Не знаю как в вашем камне, а для моего 2214/01 был косяк в разночтении доки, упоминал
Altemir здесь:
http://electronix.ru/forum/index.php?showt...mp;#entry466381 Проблема была в том, что надо в PCONP работать не с 23, а с 21 битом
LPC2378, та же проблема - не удаётся оживить SPI.
Код
//SCK
PINSEL3_bit.P1_20 = 3; //SCK0
FIO1CLR_bit.P1_20 = 1; //low
FIO1DIR_bit.P1_20 = 1; //output
PINMODE3_bit.P1_20 = 2; //no pull-up
//SSEL
PINSEL3_bit.P1_21 = 3; //SSEL0
FIO1SET_bit.P1_21 = 1; //high
FIO1DIR_bit.P1_21 = 1; //output
PINMODE3_bit.P1_21 = 0; //pull-up
//MISO
PINSEL3_bit.P1_23 = 3; //MISO0
FIO1DIR_bit.P1_23 = 0; //input
PINMODE3_bit.P1_23 = 0; //pull-up (вход выведен на разъём)
//MOSI
PINSEL3_bit.P1_24 = 3; //MOSI0
FIO1CLR_bit.P1_24 = 1; //low
FIO1DIR_bit.P1_24 = 1; //output
PINMODE3_bit.P1_24 = 2; //no pull-up
//SPI
PCLKSEL0_bit.PCLK_SPI = 3; //PCLK_SPI = CCLK/8
S0SPCCR = 0x80; //prescaler
S0SPCR = 1<<5 /*MSTR*/;
После записи в S0SPDR через некоторое время выставляется флаг SPIF в S0SPSR; тем не менее, активности на ногах MOSI, SCK не наблюдается. Выходом SSEL управляю через FIOSET/FIOCLR; пробовал выставлять его в режим GPIO. Внешний подтягивающий к 3,3В 10кОм резистор на SSEL ставил. Программный SPI работает без проблем.