STM32F100 a SPI vysílání/příjem

Ahoj, pokouším se komunikovat s SD kartou a nedaří se mi správně rozchodit SPIčko. Podle návodů co jsem četl, tak ke komunikaci potřebuju vyslat jeden znak a jeden znak přijmout. Odeslat znak se mi daří bez problémů, ale jakmile se znak odešle tak hodiny přestanou tikat a já tedy nemůžu žádný znak přijmout. SS se s tímto také nastaví do high. Nevíte někdo, kde je zakopanej pes? Zde je kód:

spi_init(){
  SPI1->CR1 = 0     
  | SPI_CR1_MSTR                                                                // Master Selection    
  | SPI_CR1_BR_0                                                                // Baud Rate Control
  | SPI_CR1_BR_1                                                                // Baud Rate Control        
  | SPI_CR1_BR_2;                                                               // Baud Rate Control
  
  SPI1->CR2 = 0
  | SPI_CR2_SSOE;                                                               // SS Output Enable
  }

uint8_t SPI_sendchar(uint8_t send_char){
   uint16_t read_spi;
   SPI1->CR1 |= SPI_CR1_SPE;                                                    // SPI Enable
   
   SPI1->DR = (uint8_t)send_char;
   while(!(SPI1->SR & SPI_SR_TXE)); 
   
   while(!(SPI1->SR & SPI_SR_RXNE));
   read_spi = SPI1->CR1;
   
   while(!(SPI1->SR & SPI_SR_TXE)); 
   while((SPI1->SR & SPI_SR_BSY));
   SPI1->CR1 &= ~SPI_CR1_SPE;                                                   // SPI Disable
   return ((uint8_t)SPI1->CR1);
   }

Musíš pořád vysílat. Jinak žádný hodiny… SS bude podle mě v L dokud bude trvat požadavek na vysílaní - hlídej si TXE.

…a SPE po celou dobu musí být povoleno…

To znamená, že nám vysílat nějaký nesmysly jen proto, aby mi clk tikalo? Co když bych chtěl jen přijímat data a tikat jim k tomu do kroku?

Preco nezmysly? Strandartne sa vysiela 0xFF a je to uplne korekne spravenie sa systemu s SPI. SPI sa potom sprava, akoby bol MOSI v stave log.1. Su AD prevodniky, ktore potrebuju pocas vycitavania udajov zapisovat nejake konkretne setup bajty a niektore SPI suciastky to zase nepotrebuju. Takze tak :slight_smile:

Pokud jsi líný tikat, mužeš do toho zapojit DMA ale většinou ta komplikace nestojí za to…

SPI je jednoduchy posuvny register. Rozhranie SPi nefunguje tak, ze sa daju data len prijimat alebo len vysielat ako pri UARTe. Z posuvneho registra sa data “vysuvaju” na pin MOSI a “vsuvaju” z pinu MISO v rytme signalu CLK.

Dík za odpovědi…třeba konečně něco naprogramuju a nebudu se furt topit.