Есть версии, почему STM32F407 может GPIO дёргать так (по времени)? Надо прочитать 3 байта, CS в это время дёргать нельзя, его формирую дрыгногой. Запускаю, жду флага "принят байт", забираю первый, второй, третий, потом снимаю CS. На осциллограмме он последние 7 бит забирает уже без CS (внизу сигнал тактирования), соответственно - там мусор. Могу дизассемблер закинуть с окна отладчика.
SPI_NSSInternalSoftwareConfig( AD7767_SPIIF, SPI_NSSInternalSoft_Set); /* select internal CS (NSS) */
AD7767_RX_ON(); /* start receiver */
AD7767_SELECT(); /* select pin == макрос GPIO_WriteBit ==*/
while ( count-- != 0) {
while ( (AD7767_SPIIF->SR & SPI_I2S_FLAG_RXNE) == 0 ) ; /* wait RX Not Empty flag */
tmp = SPI_I2S_ReceiveData( AD7767_SPIIF) << 16;
while ( (AD7767_SPIIF->SR & SPI_I2S_FLAG_RXNE) == 0 ) ; /* wait RX Not Empty flag */
tmp |= SPI_I2S_ReceiveData( AD7767_SPIIF) << 8;
while ( (AD7767_SPIIF->SR & SPI_I2S_FLAG_RXNE) == 0 ) ; /* wait RX Not Empty flag */
tmp |= SPI_I2S_ReceiveData( AD7767_SPIIF) << 0;
*dout = tmp;
dout++;
}
AD7767_RX_OFF(); /* stop receive */
SPI_NSSInternalSoftwareConfig( AD7767_SPIIF, SPI_NSSInternalSoft_Reset); /* don't select internal CS (NSS) */
AD7767_NOSELECT(); /* don't select pin */