STM32F103C - SPI master neřídí SS

Zdarec,
nesetkal se tu někdo s tím, že mu master SPI s hw SS tento pin neřídí? Když se o něj starám ručně, je to bez problému (chyba dps to tedy není), jen je to vopruz.
Hodiny pro port, AF i SPI jsou zapnuty, když požaduji hw řízení pinu, je tento pin jako AF. SSOE bit je nastaven. Zkoušel jsem čachrovat i s SSM a SSI, bezvýsledně. Situace je stejná i s použitím STM32F10x_StdPeriph_Driver.

SS pin je nastaven do 0 (aktivuje slave pokud je přítomen) okamžitě po zapnutí SPI (SPI1->CR1 |= SPI_CR1_SPE;) a nehne se.[code]void spiInit(void)
{
// SPI1=>APB2 as AF
GPIO_InitTypeDef initStr;

RCC_APB2PeriphClockCmd(SPI_PINS_CLOCKS | RCC_APB2Periph_SPI1
		| RCC_APB2Periph_AFIO, ENABLE); // spi clks enable

// GPIOs init
// mosi, clk = out AF PP
initStr.GPIO_Pin = SPI_MOSI_PIN_ | SPI_CLK_PIN_;
initStr.GPIO_Mode = GPIO_Mode_AF_PP;
initStr.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_PORT_, &initStr);

// miso = in PD (AF not used with input)
initStr.GPIO_Pin = SPI_MISO_PIN_;
initStr.GPIO_Mode = GPIO_Mode_IPD;
//initStr.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_PORT_, &initStr);

// SS
IO_HIGH(SPI_SS_PORT_, SPI_SS_PIN_);
initStr.GPIO_Pin = SPI_SS_PIN_;			// "#define SPI_SS_PIN_	GPIO_Pin_4	// PA4"
#ifdef SPI_DRIVE_SS_SW
initStr.GPIO_Mode = GPIO_Mode_Out_PP;	// drive by sw -> GPIO
#else
initStr.GPIO_Mode = GPIO_Mode_AF_PP;	// drive by hw -> AF
#endif
initStr.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_SS_PORT_, &initStr);		// "#define SPI_SS_PORT_	GPIOA"
// no remap

SPI_I2S_DeInit(SPI1);	// spi reset (function from driverlib)

// manual config (no driver lib)
// full duplex, no CRC, 8b, msb first, master mode, CPOL = CPHA = 0
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1;	// presscaler 8
#ifdef SPI_DRIVE_SS_SW
// sw driven nSS
SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;
#else
// interrupts, DMA disabled and SS output enabled
SPI1->CR2 = SPI_CR2_SSOE;	// SS output enable
#endif

SPI1->CR1 |= SPI_CR1_SPE;	// spi enable

}

uint8_t spiWriteByte(uint8_t data)
{
while(!(SPI1->SR & SPI_SR_TXE)); // wait for TX data register empty

#ifdef SPI_DRIVE_SS_SW
	IO_LOW(SPI_SS_PORT_, SPI_SS_PIN_);	// drive nSS low if manual service is required
#endif
SPI1->DR = data;					// store byte to TX data register
while(!(SPI1->SR & SPI_SR_RXNE));	// wait while RX data register empty
#ifdef SPI_DRIVE_SS_SW
	IO_HIGH(SPI_SS_PORT_, SPI_SS_PIN_);
#endif

return (uint8_t)(SPI1->DR);

}[/code]
mcu: STM32F103CBT6 (TQFP48). 3 kusy, všechny se chovají stejně.

Tak to vypadá, že nejsem sám a soudruzi z ST mají o funkci SS pinu jiný představy než ostatní :imp:.
qudon.co.uk/index.php?option … &Itemid=61
Aby tomu dali korunu, tak SPI nemá přerušení oznamující ukončení vysílání (pouze prázdný vysílací buffer). To jsem si zas jednou naběh :frowning:.