Ich versuche, ein Kommunikationsprotokoll zwischen einem FPGA und einem Mikrocontroller über ein SPI zu schreiben, wobei der µC hier der Master ist.
Hier ist der Code, den ich für den FPGA-Teil verwende . Die Simulation funktioniert gut innerhalb von Active HDL, wobei der Prozess das Master-Verhalten simuliert. So soll die Transaktion aussehen (wie im obigen Link erklärt):
Dies funktioniert in der Simulation, ich habe es geschafft, dasselbe wie in Abbildung 4 zu erhalten (siehe Link oben).
Beim Versuch, das gleiche Verhalten mit dem angeschlossenen µC zu reproduzieren, werden Daten geladen, trrdy geht hoch, ich sende einen Befehl wie "0x0A", es wird übertragen und auf dem MISO-Link ist etwas los, aber ich kann es nicht richtig lesen. Soweit ich die SPI-Kommunikation verstanden habe, soll ich die Antwort erhalten, während ich Daten über MOSI präsentiere. Ist das richtig?
Das Folgende sind Beispiele meines C-Codes. Ich bin mir ziemlich sicher, dass ich etwas falsch mache, aber mir fehlt die Erfahrung. Beim Debuggen werden die Register des Empfangspuffers oft mit "111111" gefüllt (Wörter mit 6 oder 8 Bit, das ist inkonsistent). Die sendByte-Funktion wird innerhalb eines Button-Handlers aufgerufen, und der rx-Puffer wird im spi-Event-Handler ausgegeben, der bei jeder Übertragung aufgerufen wird.
/*
* This function is supposed to ouput 00000000 01000001 to MOSI
* Data received is buffered in m_rx_buf[20] array, declared in the header
*/
void sendByteTest() {
ret_code_t err_code;
uint8_t m_tx[2];
m_tx[0] = 0x0;
m_tx[1] = 'A';
m_length = sizeof(m_tx); /**< Transfer length. */
err_code = nrf_drv_spi_transfer(&spi, m_tx, m_length, m_rx_buf, m_length);
if (err_code != NRF_SUCCESS)
NRF_LOG_PRINTF(" Error during transfer.\r\n");
memset(m_rx_buf, 0, m_length);
}
int main(void) {
/** CLOCK, BUTTONS, GPIOTE initialization omitted **/
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG(SPI_INSTANCE);
spi_config.ss_pin = SPI_CS_PIN;
spi_config.mode = NRF_DRV_SPI_MODE_2; // ss_n is active low, set accordingly
spi_config.frequency = NRF_DRV_SPI_FREQ_125K;
spi_config.bit_order = NRF_SPI_BIT_ORDER_MSB_FIRST;
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler));
int i = 0;
while(1) {
nrf_gpio_pin_toggle(LED_1);
nrf_delay_ms(200);
}
}
Was ich nicht im Sinn hatte, ist, dass SPI-Kommunikation vorschlägt, dass Sie so viele Daten senden sollten, wie Sie empfangen möchten, nicht mehr und nicht weniger. Deshalb war mein Puffer laut. Durch Setzen m_length
auf 1 : err_code = nrf_drv_spi_transfer(&spi, m_tx, m_length, m_rx_buf, m_length);
Ich sende erfolgreich ein Byte, während ich genau ein Byte in meinem Empfangspuffer empfangem_rx_buf
Für die erste Übertragung (Befehl) erhalte ich Dummy-Daten, die ich nicht verarbeite, für die eigentliche Übertragung puffere ich sie und verarbeite sie.
brhans
Flauschige
brhans
Flauschige
Flauschige
data[] = "0A"
funktioniert irgendwie, um das Ganze in einer Anfrage zu erledigen, aber ich bekomme die Antwort inrx_buf[1]
, währendrx_buf[0]='\0'
ich es deshalb vorher nicht sehen konnte. Aber am wichtigsten ist, dass es das trdy-Bit nicht löscht, was bedeutet, dass der Slave das Ende der Übertragung nicht bestätigt :(KyranF