Пробовал:
разные варианты полярности и фазы SPI
понижать частоту контроллера до 1 MHz (SPI – 3KHz)
8 и 16 bit режимы
сдвигать биты влево и т.д
Не происходит инициализация!
С программным SPI все работает!!!
Reference manual
Код: Выделить всё
void SPI_Send(uint16_t Data) {
while (!(SPI1->SR &= SPI_SR_TXE));
SPI1->DR = Data;
}Эт точно!!!dosikus писал(а):Настраиваем передачу нормально а не методом тыка и на 8 бит(пока).
Дык... в данном случае... чуток поправляем и можно юзать...Этот бред переписываем
Ну да , что то я озверел...HHIMERA писал(а): Дык... в данном случае... чуток поправляем и можно юзать...
Правим функцию... т.к. SPI в F0 немножко отличается... в частности работой в режиме 8 bit...wss60 писал(а):Не происходит инициализация!
С программным SPI все работает!!!
Код: Выделить всё
#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;
}
Код: Выделить всё
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 нужно или сразу лепить "магическое число"... или сбрасывать биты, а не устанавливать... причина - читайте в рефмане...
Код: Выделить всё
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
}Юзаете CS софтварно - устанавливайте SSI и SSM...если желаете юзать NSS, то настрамвайте и пин, и SPI... а если нет - то установить SSI и SSM...
Код: Выделить всё
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);
}Код: Выделить всё
#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);
}Код: Выделить всё
#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);
}

Если фрэйм <=8 надо установить FRXTH в CR2 ...wss60 писал(а):Если так, то зависает на цикле while (!(SPI1->SR & SPI_SR_RXNE));Код: Выделить всё
#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); }
даdosikus писал(а):wss60 , CS то дергаете вручную ?
Приобретите лог. анализатор , сэкономите время и нервы...wss60 писал(а): С хардварным CS тоже не работало!