Цитата(k155la3 @ Oct 3 2016, 23:20)

Если так, для проверки выведите вызов в основную программу и проверьте будет ли глючить там.
В том то и дело, что пара вызовов из основной программы вроде работала как надо. А в коде HAL прерываний не заметил. Это первое, что пришло в голову.
Я слегка соврал, что всегда по 2 байта. Забыл что есть чтение/запись Si4432 FIFO с произвольным, не обязательно четным числом байт. Поэкспериментировал с переключением с 8 на 16 бит и обратно, и тоже глючит. В результате скатился на всегда по 8 бит и даже 8 битное обращение к регистру. Скорость мне не важна - пока идет обмен, процессор все равно ждет.
После отказа от вызовов HAL SPI, размер кода на 2 К уменьшился. Хоть памяти и много, все равно приятно.
Код получился корявый, но вроде работает как надо. Пришлось, возможно в лишних местах, делать чтениа SDR для очистки RX FIFO.
CODE
void SPI1_init(){
__HAL_RCC_SPI1_CLK_ENABLE();
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_BR_0 | SPI_CR1_SSM | SPI_CR1_SSI;
SPI1->CR2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0; // 8 bit
SPI1->CR2 |= SPI_CR2_FRXTH; // fifo treshold for 8 bits
SPI1->CR1 |= (1 << 6); // enable
}
#define SPI1_DR_8_bit (*(__IO uint8_t *)((uint32_t) & (SPI1->DR)))
void WriteSPI(uint8_t addr, uint8_t data){
uint8_t val;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // SPI active
val = SPI1->DR; // clear just in case
while((SPI1->SR & SPI_SR_TXE) == 0); // wait for TX empty
SPI1_DR_8_bit = addr;
while((SPI1->SR & SPI_SR_RXNE) == 0); // wait for RX
val = SPI1_DR_8_bit; // discarded
while((SPI1->SR & SPI_SR_TXE) == 0); // wait for TX empty
SPI1_DR_8_bit = data;
while(SPI1->SR & SPI_SR_BSY);
while((SPI1->SR & SPI_SR_RXNE) == 0); // wait for RX
val = SPI1_DR_8_bit;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // SPI not active
}
uint8_t ReadSPI(uint8_t addr){
uint8_t val;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // SPI active
val = SPI1->DR; // clear just in case
while((SPI1->SR & SPI_SR_TXE) == 0); // wait for TX empty
SPI1_DR_8_bit = addr;
while((SPI1->SR & SPI_SR_RXNE) == 0); // wait for RX
val = SPI1_DR_8_bit; // discarded
while((SPI1->SR & SPI_SR_TXE) == 0); // wait for TX empty
SPI1_DR_8_bit = 0xff;
while(SPI1->SR & SPI_SR_BSY);
while((SPI1->SR & SPI_SR_RXNE) == 0); // wait for RX
val = SPI1_DR_8_bit;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // SPI not active
return val;
}
Сообщение отредактировал IgorKossak - Oct 4 2016, 09:24
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!