STM32F0 и LPH8836

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

Пытаюсь подключить LCD - LPH8836 (от CX65) к STM32F051.
Пробовал:
разные варианты полярности и фазы SPI
понижать частоту контроллера до 1 MHz (SPI – 3KHz)
8 и 16 bit режимы
сдвигать биты влево и т.д
Не происходит инициализация!
С программным SPI все работает!!!

Reference manual
Вложения
spi.c
(2.6 КБ) 364 скачивания
disp.c
(2.88 КБ) 573 скачивания
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Настраиваем передачу нормально а не методом тыка и на 8 бит(пока).

Этот бред переписываем :

Код: Выделить всё

void SPI_Send(uint16_t Data) {
  while (!(SPI1->SR &= SPI_SR_TXE));
  SPI1->DR = Data;
}
Проверять надо флаг буфера приемника с последующим вычитыванием буфера .
Все это для не потоковых передач одиночных байт.
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

dosikus писал(а):Настраиваем передачу нормально а не методом тыка и на 8 бит(пока).
Эт точно!!! :))
Этот бред переписываем
Дык... в данном случае... чуток поправляем и можно юзать...
"Я не даю готовых решений, я заставляю думать!"(С)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

HHIMERA писал(а): Дык... в данном случае... чуток поправляем и можно юзать...
Ну да , что то я озверел... :)))
Добавить проверку RXNE и вычитку, а проверка TXE и на здесь не нужна.
Интересно дойдет ли ? :)))
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

wss60 писал(а):Не происходит инициализация!
С программным SPI все работает!!!
Правим функцию... т.к. SPI в F0 немножко отличается... в частности работой в режиме 8 bit...
Если юзать хардварный NSS, то можно и так...

Код: Выделить всё


#define SPI1_DR_8b          (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))

void SPI_Send(uint8_t Data) {
  while((SPI1->SR & SPI_SR_TXE) == RESET);        // Wait for SPI Tx Buffer Empty
  SPI1_DR_8b = Data;
}
Дальше... BIDIOE и BIDIMODE нафиг не нужны... если желаете юзать NSS, то настрамвайте и пин, и SPI... а если нет - то установить SSI и SSM...
В F0 настройка Data Size отличается... в CR2 нужно или сразу лепить "магическое число"... или сбрасывать биты, а не устанавливать... причина - читайте в рефмане...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

Пробовал:
Спойлер

Код: Выделить всё

unsigned char SPI_Send(uint16_t Data)
{
  SPI1->DR = Data;
  while (!(SPI1->SR & SPI_SR_RXNE));
  return(SPI1->DR);
}

Код: Выделить всё

void SPI_Send(uint16_t Data) {
  while (!(SPI1->SR &= SPI_SR_TXE));
  SPI1->DR = Data;
}

Код: Выделить всё

void SPI_Send(uint16_t Data) {
  delay_ms(10);
  SPI1->DR = Data;
}

Код: Выделить всё

#define SPI1_DR_8b          (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
void SPI_Send(uint8_t Data) {
  while((SPI1->SR & SPI_SR_TXE) == RESET);        // Wait for SPI Tx Buffer Empty
  SPI1_DR_8b = Data;
}
во всех случаях - без результатов...
Ни что его не берет…
HHIMERA писал(а):В F0 настройка Data Size отличается... в CR2 нужно или сразу лепить "магическое число"... или сбрасывать биты, а не устанавливать... причина - читайте в рефмане...
Можно ли по подробнее? В референсе ничего про это не нашел.

Инициализация SPI:
Спойлер

Код: Выделить всё

void SPI1_init (void)
{
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;    //включить тактирование порта B
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;    //включить тактирование SPI1
  GPIOB->MODER   |= GPIO_MODER_MODER5_1|GPIO_MODER_MODER3_1;           // PB3,5 (CLK,DAT) - Alternate function mode
  GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5|GPIO_OSPEEDER_OSPEEDR3;     // PB3,5 (CLK,DAT) - High speed


  SPI1->CR1 |= SPI_CR1_BR_2|SPI_CR1_BR_1|SPI_CR1_BR_0;       // скорость обмена
  SPI1->CR1 |= SPI_CR1_MSTR|SPI_CR1_SSI|SPI_CR1_SSM|SPI_CR1_SPE;
  SPI1->CR2  = 0b0000011100000000;   // "магическое число)" 8 bit
}
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Дык... написал же...
если желаете юзать NSS, то настрамвайте и пин, и SPI... а если нет - то установить SSI и SSM...
Юзаете CS софтварно - устанавливайте SSI и SSM...
И прав dosikus... кто за вас окончание передачи (BSY) перед поднятием CS проверять будет???
Затолкали байт в регистр данных и сразу его чикнули поднятием CS... чудесно...
Другое дело если хардварный NSS... но тогда и CS вручню дёргать нафиг не нужно...
"Я не даю готовых решений, я заставляю думать!"(С)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

Код: Выделить всё

void SPI1_init (void)
{

  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;    //включить тактирование SPI1
  GPIOB->MODER   |= GPIO_MODER_MODER5_1|GPIO_MODER_MODER3_1;           // PB3,5 (CLK,DAT) - Alternate function mode
  GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5|GPIO_OSPEEDER_OSPEEDR3;     // PB3,5 (CLK,DAT) - High speed


  SPI1->CR1 |= SPI_CR1_BR_2|SPI_CR1_BR_1|SPI_CR1_BR_0;       // скорость обмена
  SPI1->CR1 |= SPI_CR1_MSTR|SPI_CR1_SSI|SPI_CR1_SSM|SPI_CR1_SPE;
  SPI1->CR2  = 0b0000011100000000;   // "магическое число)" 8 bit
  
  
}

unsigned char SPI_Send(unsigned char data)
{ 
  SPI1->DR = data;                    
  while (!(SPI1->SR & SPI_SR_RXNE));     
  return (SPI1->DR);              
}
“SSI” и “SSM” биты стоят, проверка по RX есть- что не так?
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))

и

SPI1_DR_8b = Data;

Иначе в 8-ми битном режиме не будет работать... будет гнать 16-бит вместо 8-ми...
"Я не даю готовых решений, я заставляю думать!"(С)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

Код: Выделить всё

#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
unsigned char SPI_Send(unsigned char data)
{ 
  SPI1_DR_8b = data;                  
  while (!(SPI1->SR & SPI_SR_RXNE));     
  return (SPI1->DR);              
}
Если так, то зависает на цикле while (!(SPI1->SR & SPI_SR_RXNE));
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

А если так???

Код: Выделить всё

#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))


void SPI_Send (unsigned char data)
{ 
  SPI1_DR_8b = data;                  
  while(SPI1->SR & SPI_SR_BSY);
}
Осциллограф или логический анализатор есть??? Иначе - тяжко...
"Я не даю готовых решений, я заставляю думать!"(С)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

Победа!!! Заработало!!! :music:
Целую неделю его мучил…
HHIMERA, Спасибо!!!
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

wss60 , CS то дергаете вручную ?

Кстати эта ж... похоже только при размере фрэйма <=8 .
Выхлоп 9бит: проверка именно RXNE с вычиткой , CS (NSS) дергается хардварно.

Изображение
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

wss60 писал(а):

Код: Выделить всё

#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
unsigned char SPI_Send(unsigned char data)
{ 
  SPI1_DR_8b = data;                  
  while (!(SPI1->SR & SPI_SR_RXNE));     
  return (SPI1->DR);              
}
Если так, то зависает на цикле while (!(SPI1->SR & SPI_SR_RXNE));
Если фрэйм <=8 надо установить FRXTH в CR2 ...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Сообщение wss60 »

dosikus писал(а):wss60 , CS то дергаете вручную ?
да
С хардварным CS тоже не работало!
Буду пробовать переводить в 16- битный режим, а то скорости маловато.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

wss60 писал(а): С хардварным CS тоже не работало!
Приобретите лог. анализатор , сэкономите время и нервы...
Ответить

Вернуться в «ARM»