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ě.