Bonjour,
Je suis actuellement en stage et j'ai besoin de réaliser une fonction de transfert avec le Bus SPI.
J'en ai réalisé une grâce à la datasheet de mon microcontrôleur (https://ww1.microchip.com/downloads/..._Datasheet.pdf, page 676 à 707 pour la partie SPI).
Voici ma fonction :
La fonction tourne bien cependant la valeur lue est toujours 0...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 static inline uint8_t spi_transmit(uint8_t data) { printf("Donnee a envoyer : %i \n", data); data = SPI_TDR_TD(data) | SPI_TDR_PCS(SPI_CHIP_SEL); //Transmission while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); SPI0->SPI_TDR = data; printf("Transmis : %i \n", data); //Lecture while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); data = SPI0->SPI_RDR; printf("Lu : %i \r\n", data); return data & SPI_RDR_RD_Msk; }
Avez vous une idée de ce qui cloche ?
Voici un screen de mon signal SPI SCLK (en jaune) et de mon signal SPI MISO :
EDIT :
Apparemment, le problème viendrait de mon Chip Select qui n'attend pas les autres octets et donc comme au premier octet envoyé MISO est nul c'est pourquoi je ne lis que des 0. Cependant je ne sais pas quoi corriger pour obtenir un Chip Select correcte...
Voici un screen de l'oscilloscope que je devrais obtenir pour que cela marche :
Voici mon initialisation de mon bus SPI :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 /* 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_peripheral_chip_select_value(SPI0, SPI_CHIP_SEL); 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)); spi_enable(SPI0);
Partager