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; }
-----


. Je vois une différence entre le mosi qui fonctionne et celui qui ne fonctionne pas , c'est le temps entre 2 octets. Dans celui qui fonctionne le temps de repos est environ égal à la durée d'un octet. Dans le MOSI incorrect le temps de repos est très court. J'ai pas lu en détail le datasheet mais peut être qu'il faut laisser "respirer" le slave entre 2 octets ..Faut s'arranger pour comparer les mêmes choses => Les 2 MOSI doivent être identique ou très proches , la c'est pas le cas. 