Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Soft SPI avec XC8
gwion
Passionné
Passionné
Messages : 211
Enregistré en : février 2022

#1 Message par gwion » dim. 22 oct. 2023 07:38

Bonjour,
Pour ceux qui programment en C avec XC8, utilisez-vous une bibliothèque pour vous faciliter la vie avec le SPI ?
Et si oui laquelle ?
Merci et bon dimanche :-)

Soft SPI avec XC8
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » dim. 22 oct. 2023 11:11

bonjour Bruno,

la question est Software SPI Hardware
ou SPI Software ( bit bang) ?

Pour quel PIC ?

sinon un bon morceau de discussion sur ce sujetICI
OLED GC9A01 et SPI Hardw 18F27K42
ou
LCD OLED 1,3" grafique 128 x64 , PIC 18F26K22

utiliser l'outil MPLAB MCC permet de dégrossir (avec selection Ressources SPI)
mais inclus énormement de code dormant ... beaucoup plus que nécessaire.
Aide toi, le ciel ou FantasPic t'aidera

Soft SPI avec XC8
gwion
Passionné
Passionné
Messages : 211
Enregistré en : février 2022

#3 Message par gwion » jeu. 26 oct. 2023 18:30

Bonjour Paul, bonjour tout le monde,

Quand il y a un SPI hardware, ça me semble assez simple pour se passer de bibliothèque. Par contre pour du bit bang, ça se corse...

Soft SPI avec XC8
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2599
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » jeu. 26 oct. 2023 19:43

non testée personellement






Code : Tout sélectionner

*
Software SPI library functions
*/
#ifndef softwareSPI_h
#define softwareSPI_h
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000
/*#define SCK RC3
#define MOSI RC5
#define MISO RC4*/
#define SCK RA0
#define MOSI RA1
#define MISO RA2
unsigned char writeSPIByte(unsigned char transmit);
int writeSPIWord(unsigned short int setting);
int writeSPI24bits(unsigned short long setting);
int readSPIWord();
unsigned char readSPIByte();
#endif





Code : Tout sélectionner




/*
Software SPI library functions - currently only works in mode 1 used for 25AA** EEPROM
*/
#include <xc.h>
#include "softwareSPI.h"
unsigned char writeSPIByte(unsigned char transmit){
unsigned char received = 0;
unsigned char bits = 8;
unsigned char tmpbit = 0;
SCK = 0;
//make the transmission
unsigned char mask = 0x80; //Initialize to write and read bit 7
unsigned char ret = 0; //Initialize read byte with 0
do{
//Clock out current bit onto SPI Out line
if (transmit & mask)
MOSI = 1;
else
MOSI = 0;
SCK = 1; //Set SPI Clock line
if (MISO)
ret |= mask; //Read current bit fromSPI In line
__delay_us(1); //Ensure minimum delay of 500nS between SPI Clock high and SPI Clock Low
SCK = 0; //Set SPI Clock line
mask = mask >> 1; //Shift mask so that next bit is written and read from SPI lines
__delay_us(1); //Ensure minimum delay of 1000ns between bits
}while (mask != 0);
return ret;
}
int writeSPIWord(unsigned short int setting)
{
int data;
unsigned char b1, b2;
b1 = writeSPIByte(setting >> 8);
b2 = writeSPIByte(setting);
data = b1 << 8 | b2;
__delay_us(50);
return data;
}
int writeSPI24bits(unsigned short long setting)
{
unsigned short long data;
unsigned char b1, b2, b3;
b1 = writeSPIByte(setting >> (unsigned short long)16);
b2 = writeSPIByte(setting >> 8);
b3 = writeSPIByte(setting);
data = (unsigned short long)b1 << (unsigned short long)16 | b2 << 8 | b3;
__delay_us(50);
return data;
}
int readSPIWord(){
int data;
unsigned char b1, b2;
b1 = writeSPIByte(0x00);
b2 = writeSPIByte(0x00);
data = b1 << 8 | b2;
return data;
}
unsigned char readSPIByte(){
unsigned char data;
data = writeSPIByte(0x00);
return data;
}




et la version asm de tempsX ? à transposer en C
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités