Bonjour,
Je travaille avec un microcontrôleur SAM3X8E (datasheet : https://ww1.microchip.com/downloads/..._Datasheet.pdf, page 676 to 707 for SPI).
Je veux faire du multi-transfert d'octets grâce au bus SPI donc j'ai initialisé mon CS comme un GPIO pour le piloter manuellement.
Mon CS, mon CLK et mon MOSI sont corrects mais je ne sais pas pourquoi mon MISO me renvoie toujours 0...
Voici ce que je vois actuellement avec mon oscilloscope :
.CS :
CS_Actual.png
.MOSI :
MOSI_Actual.png
.MISO :
MISO_Actual.png
Et voici les signaux à l'oscilloscope d'un code qui fait exactement ce que je veux (mais sous Arduino et je suis sous Atmel 7) :
.MOSI :
MOSI__Correct.png
.MISO :
MISO_Correct.png
Sur les bons oscilloscopes vous pouvez voir que le MISO est à 0 mais juste pour le premier octet et dans mon cas il est toujours à 0...
Voici mon code pour initialiser mon Bus SPI :
Code:/* Configure SPI0 pins */ gpio_configure_pin(SPI0_MISO_GPIO, (PIO_PERIPH_A | PIO_DEFAULT)); gpio_configure_pin(SPI0_MOSI_GPIO, (PIO_PERIPH_A | PIO_DEFAULT)); gpio_configure_pin(SPI0_SPCK_GPIO, (PIO_PERIPH_A | PIO_DEFAULT)); gpio_configure_pin(SPI0_NPCS0_GPIO, (PIO_OUTPUT_1 | PIO_DEFAULT)); //CS /* Configure an SPI peripheral. */ spi_enable_clock(SPI0); spi_disable(SPI0); spi_reset(SPI0); //spi_set_lastxfer(SPI0); spi_set_master_mode(SPI0); spi_disable_mode_fault_detect(SPI0); spi_set_variable_peripheral_select(SPI0); spi_set_peripheral_chip_select_value(SPI0, SPI_CHIP_SEL); //SPI_CHIP_SEL == 0 /* data samples on rising edge because Polarity = Phase = 0 */ spi_set_clock_polarity(SPI0, SPI_CHIP_SEL, SPI_CLK_POLARITY); spi_set_clock_phase(SPI0, SPI_CHIP_SEL, SPI_CLK_PHASE); spi_set_bits_per_transfer(SPI0, SPI_CHIP_SEL, SPI_CSR_BITS_8_BIT); spi_set_baudrate_div(SPI0, SPI_CHIP_SEL, (sysclk_get_peripheral_hz() / gs_ul_spi_clock)); SPI0->SPI_CSR[0] |= SPI_CSR_CSAAT; spi_enable(SPI0);
Voici le code que j'utilise pour faire mon transfer :
Et voici ma fonction spi_transmit(...) :Code:uint8_t ftData8; EVE_cs_set(); //CS at 0 spi_transmit_32(...); //Make 4 spi_transmit(...) ftData8 = spi_receive(0x00); /* read data byte by sending another dummy byte thanks to spi_transmit(...) */ EVE_cs_clear(); //CS at 1 return ftData8; /* return byte read */
Pouvez-vous voir d'où vient le problème ?Code:static inline uint8_t spi_transmit(uint8_t data) { while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); spi_write(SPI0, data, SPI_CHIP_SEL, 0); while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); uint8_t data_read, Chip_Sel_read; spi_read(SPI0, &data_read, &Chip_Sel_read); return data_read; }
-----