Strana 1 z 1

Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 16:03
od používateľa romiadam
Ahojte,
Prosim o pomoc.

Uz pol hodiny cumim do katalogu a ani za svet tam nevidim kde sa nastavuje CLK polarita SPI. Bud to tam je a ja to nevidim, alebo to tam nie je a je to zly katalog.

Na strane 12 sekcia 4.1 sa pise toto:
image.png
Ja potrebujem nastavit tento mod, CPOL = 0, CPHA = 0, len akosi neviem najst kde sa to nastavuje. Ze by sa to nenastavovalo a akceptuje to oboje? Ale potom naco tam dali tie bity CPOL a CPHA?

Mozete sa prosim na to pozriet?

Link na web
https://www.farnell.com/datasheets/2914061.pdf

Dakujem.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 16:12
od používateľa maskrtnik01
Tá pamäť je SPI slave? Tento režim sa nastavuje na masteri. Ak nesedí toto nastavenie, je to dôvod aby vôbec nefungovala komunikácia po zbernici.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 18:02
od používateľa daqq
Nikde sa to nenastavuje na pamati. Datasheet hovori, ze vie fungovat pri takychto nastaveniach MASTER zariadenia.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 21:19
od používateľa peterple
Ono je to v podstate jedno. Podstatné je že vstupné data a aj výstupné sú stabilné pri nábežnej hrane. Tie dva módy tam dostali tak že rozlišujú z akej východiskovej úrovne dát to začína či z nuly alebo jednotky. Ale ako vidno z tých grafov je to fuk. Data sa musia meniť pri dobežnej hrane.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 22:16
od používateľa romiadam
Ja mam na zbernici tri zariadenia toto som nechapal ako myslia, ale aj mne sa zdalo ze podporuje oba rezimy, len neviem preco tam pisu o tych dvoch registroch CPOL = 0, CPHA = 0, ked sa to nikde neda nastavit. Mali tam len napisat z to podporuje obe a neplist me s tym CPOL = 0, CPHA = 0.

Dalsi podporuje ked je CLK v standby v nule a treti sa da lubovolne nakonfiurovat. Tam tiez zvolim nulu.

Tak to vyskusam ci to pojde a dam vediet.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 06 Jún 2022, 22:16
od používateľa romiadam
daqq napísal:
06 Jún 2022, 18:02
Nikde sa to nenastavuje na pamati. Datasheet hovori, ze vie fungovat pri takychto nastaveniach MASTER zariadenia.
Musim si lepsie otvorit oci...

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 07 Jún 2022, 01:02
od používateľa romiadam
Mam este jednu otazku ohladom SPI v C.

Pouzivam MCC konfigurator, co velmi ulahci nastavenie MCU periferii teaz konktetne PIC18F46K40. No niekedy MCC vygeneruje kod ktoremu vobec nerozumiem. Pre SPI MCC vygeneroval spi1.h a spi1.c.

spi1.h

Kód: Vybrať všetko

#ifndef SPI1_H
#define SPI1_H

/**
  Section: Included Files
*/

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

/* SPI interfaces */
typedef enum { 
    SPI1_DEFAULT
} spi1_modes_t;

void SPI1_Initialize(void);
bool SPI1_Open(spi1_modes_t spi1UniqueConfiguration);
void SPI1_Close(void);
uint8_t SPI1_ExchangeByte(uint8_t data);
void SPI1_ExchangeBlock(void *block, size_t blockSize);
void SPI1_WriteBlock(void *block, size_t blockSize);
void SPI1_ReadBlock(void *block, size_t blockSize);
void SPI1_WriteByte(uint8_t byte);
uint8_t SPI1_ReadByte(void);

#endif //SPI1_H
a spi1.c subor

Kód: Vybrať všetko

#include "spi1.h"
#include <xc.h>

typedef struct { 
    uint8_t con1; 
    uint8_t stat;
    uint8_t add;
    uint8_t operation;
} spi1_configuration_t;

//con1 == SSPxCON1, stat == SSPxSTAT, add == SSPxADD, operation == Master/Slave
static const spi1_configuration_t spi1_configuration[] = {   
    { 0x0, 0x40, 0x1, 0 }
};

void SPI1_Initialize(void)
{
    //Setup PPS Pins
    SSP1CLKPPS = 18;
    SSP1DATPPS = 17;
    RC2PPS    = 15;
    RC0PPS    = 16;
    //SPI setup
    SSP1STAT = 0x40;
    SSP1CON1 = 0x00;
    SSP1ADD = 0x01;
    TRISCbits.TRISC2 = 0;
    SSP1CON1bits.SSPEN = 0;  // serial port ON/OFF (SPI -> ON/OFF) - moj komentar
}

    bool SPI1_Open(spi1_modes_t spi1UniqueConfiguration)
{
    if(!SSP1CON1bits.SSPEN)
    {
        SSP1STAT = spi1_configuration[spi1UniqueConfiguration].stat;
        SSP1CON1 = spi1_configuration[spi1UniqueConfiguration].con1;
        SSP1CON2 = 0x00;
        SSP1ADD  = spi1_configuration[spi1UniqueConfiguration].add;
        TRISCbits.TRISC2 = spi1_configuration[spi1UniqueConfiguration].operation;
        SSP1CON1bits.SSPEN = 1;
        return true;
    }
    return false;
}

void SPI1_Close(void)
{
    SSP1CON1bits.SSPEN = 0;
}

uint8_t SPI1_ExchangeByte(uint8_t data)
{
    SSP1BUF = data;
    while(!PIR3bits.SSP1IF);
    PIR3bits.SSP1IF = 0;
    return SSP1BUF;
}
void SPI1_ExchangeBlock(void *block, size_t blockSize)
{
    uint8_t *data = block;
    while(blockSize--)
    {
        SSP1BUF = *data;
        while(!PIR3bits.SSP1IF);
        PIR3bits.SSP1IF = 0;
        *data++ = SSP1BUF;
    }
}

// Half Duplex SPI Functions
void SPI1_WriteBlock(void *block, size_t blockSize)
{
    uint8_t *data = block;
    while(blockSize--)
    {
        SPI1_ExchangeByte(*data++);
    }
}

void SPI1_ReadBlock(void *block, size_t blockSize)
{
    uint8_t *data = block;
    while(blockSize--)
    {
        *data++ = SPI1_ExchangeByte(0);
    }
}

void SPI1_WriteByte(uint8_t byte)
{
    SSP1BUF = byte;
}

uint8_t SPI1_ReadByte(void)
{
    return SSP1BUF;
}

Co mi nie je jasne v spi1.c je to ze MCC konfigurator v inicializacii v poslednom riadku nastavil SSP1CON1bits.SSPEN = 0;, co je SPI disable. Takze ja mam najprv zavolat funkciu SPI1_Open() a potom napr. SPI1_ExchangeByte() a nakoniec SPI1_Close(). Takto by to malo byt spravne? Alebo to nemusi byt takto?

Ja som nevedel ako zavolat funkciu bool SPI1_Open(spi1_modes_t spi1UniqueConfiguration), lebo neviem co je to "spi1UniqueConfiguration" a dokonca aky je to typ premennej "spi1_modes_t". Vracia to bool.

Tak som to docasne oblbol tak, ze som v inicializacii v poslednom riadku prepisal 0 na 1 a po inicializacii rovno zavolal funkciu SPI1_ExchangeByte(126) -> cislo 01111110 a funguje to.

Mna len zaujima ze preco to MCC spravil tak komplikovane. Aky vyznam ma ta funkcia SPI1_Open a ako sa spravne vola lebo nie je tam void, takze neaky vstup asi vyzaduje a neviem co tam dosadit.

Dakujem vopred za pomoc.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 07 Jún 2022, 07:59
od používateľa maskrtnik01
romiadam napísal:
06 Jún 2022, 22:16
len neviem preco tam pisu o tych dvoch registroch CPOL = 0, CPHA = 0, ked sa to nikde neda nastavit. Mali tam len napisat z to podporuje obe a neplist me s tym CPOL = 0, CPHA = 0.
Nuž ja mám zrejme so SPI viac skúseností, mne ten text nepríde zmätočný. Jasne tam píšu, že sa jedná o nastavenie mikrokontroléra.


Zo zvedavosti, aký IO tam máte, že podporuje konfiguráciu SPI mode? Môžete poslať typ obvodu?

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 07 Jún 2022, 10:52
od používateľa romiadam
MCU je PIC18F46K40. Pamat je M95M04-DR.

Aha, takze to je tam pre nastavenie MCU? A ja som to pochopil ze to je pre nastavenie pamate, ze si ten mod mozem vybrat ktory mi vyhovuje a ze nikde sa to ma v pamati nakonfigurovat. Tak potom to te jasne.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 07 Jún 2022, 11:13
od používateľa Miko6005
ahoj, chapem ze je to SPI v C ale, ak si clovek spatne pozrie v dissemblingu co tieto programy /MCC/ dokazu generovat... Vzdy pri prvom pokuse pisem binar nakolko sa to jednoduchsie porovnava s manualom k mikrokontorleru, nastavenie SPI:

Kód: Vybrať všetko

CLR  REG1
LDI  REG1,0B10111100
STS  DIR_C,REG1
LDI  REG1,0B01010000
STS  CTRL_SPI,REG1
LDI  REG1,0B00000001
STS  INTCTRL_SPI,REG1
LDI  REG1,0B00000000
STS  CTRLB_SPI,REG1
LDI  REG1,0B00011100
STS  OUT_C,REG1
CLR  REG1
Zapis:

Kód: Vybrať všetko

CLR REG1
LDI REG1,0B00000000
STS OUT_C,REG1
LDI REG1,0XA0
STS DATA_SPI,REG1
OK1:
      CLR   REG5           
      LDS   REG5,STATUS_SPI
      SBRS  REG5,7 
      RJMP  OK1
      CLR   REG5
LDI REG1,0B00011000
STS OUT_C,REG1
CLR REG1
Citanie:

Kód: Vybrať všetko

CLR REG2
CLR REG1
LDI REG1,0B00000000
STS OUT_C,REG1
LDI REG1,0X00
STS DATA_SPI,REG1
CLR REG1
LDS REG1,DATA_SPI
MOV REG2,REG1
CLR REG1
CALL SPI_LCD_HOLD
LDI REG1,0B00000000
STS OUT_C,REG1
CLR REG1
Je to len prvotna skuska displeja na SPI a citanie z eeprom na SPI nic nieje osetrene ani dalsie pouzitie pinov mikrokontrolera atd. Ak chcem vediet viac co sa mi odohrava na zbernici pripadne menim nastavenia tak pouzivam osciloskop sice ma aj analyzer ale na zobrazenie prebehov postacuje aj dvojkanalovy osciloskop. Len som chcel ukazat ze sa nejedna o nic zlozitea clovek vie co sa mu tam odohrava . Nastavenie SPI je pre Xmegu. Mozno to niekomu pomoze.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 08 Jún 2022, 13:29
od používateľa romiadam
Miko6005,
ten tvoj prispevok som nepochopil.

Otazka bola preco v inicializacii sa deaktivuje SPI port a potom v SPI1_Open() sa aktivuje (povoli) a v SPI1_Close() sa zase deaktivuje.
A na co sluzi a ako sa vola ta funkcia SPI1_Open() a SPI1_Close() co vygenerovl MCC. Preco je to tak spravene.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 09 Jún 2022, 14:51
od používateľa balu
romiadam - (ze SZ) napísal:Preco tam MCC dal SPI1_Open a SPI1_Close(). TO sa ma stale SPI aktivovat a deaktivovat?
A ako presne sa vola ta funkcia SPI1_Open? Nie j tam void, takze asi vyzaduje neake premenne, lenze co je toto (spi1_modes_t spi1UniqueConfiguration)?
S PICama nedělám, ale myslím si, že SPI1_Open a SPI1_Close() aktivuje vybranou konfiguraci (to je ten parametr volání) nebo deaktivuje HW SPI interface. Vzhledem k tomu, že spi1_modes_t (viz. dále) je tam jen jeden, tak můžeš na začátku zavolat SPI1_Open a pak ho jenom používat. SPI1_Close() nemusíš používat vůbec (tedy pokud nebudeš používat bootloader, přepnutí do něj apod.). Prostě zapneš zařízení, to otevře SPI interface a tím to vadne.

Pokud používáš více SPI zařízení na jednom SPI portu, pak se příjem dat na jednotlivých periferiích aktivují signálem !SS (Slave Select - aktivní v nule) - ovšem za předpokladu, že jej všechny periferie mají. Pak každá periferie používá společné signály MOSI, MISO, CLK a svůj vlastní !SS.
MOSI = Master Out Slave In
MISO = Master In Slave Out

Co je bool SPI1_Open(spi1_modes_t spi1UniqueConfiguration) :
bool => funkce SPI1_Open vrací hodnotu TRUE nebo FALSE.
spi1UniqueConfiguration => název proměnné, do které se uloží hodnota parametru, se kterou funkci SPI1_Open voláš. Proměnná je typu spi1_modes_t.

Kód: Vybrať všetko

/* SPI interfaces */
typedef enum { 
    SPI1_DEFAULT
} spi1_modes_t;
Výčtový typ - v tomto případě může proměnná typu spi1_modes_t nabývat pouze hodnoty SPI1_DEFAULT, což je v tomto případě 0.


Osobně bych typ definoval takto :

Kód: Vybrať všetko

/* SPI interfaces */
typedef enum SpiModesEnum
{ 
    SPI1_DEFAULT
} SpiModesEnum;
Přijde mi to daleko jasnější a na první pohled vím, jakého typu proměnná je.
Posuď sám : SpiModesEnum vs. spi1_modes_t.

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Napísané: 10 Jún 2022, 01:28
od používateľa romiadam
Dakujem velmi pekne za vystizny vyklad.