Nastaveie polarity CLK pre EEPROM (SPI)

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 06 Jún 2022, 16:03

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2567
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa maskrtnik01 » 06 Jún 2022, 16:12

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.
0

Používateľov profilový obrázok
daqq
Power user
Power user
Príspevky: 2528
Dátum registrácie: 10 Jún 2008, 00:00
Bydlisko: Bratislava
Vek: 36
Kontaktovať používateľa:

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa daqq » 06 Jún 2022, 18:02

Nikde sa to nenastavuje na pamati. Datasheet hovori, ze vie fungovat pri takychto nastaveniach MASTER zariadenia.
0
Outsource your thinking: Get religious!
Zistenie: Ked robite sucasne v C, C++, C#, Matlabe, trocha pokukujete po VHDL, sialenstvo nemoze byt daleko...este stastie, ze som lietadlo a nemam tieto problemy.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa peterple » 06 Jún 2022, 21:19

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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 06 Jún 2022, 22:16

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 06 Jún 2022, 22:16

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...
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 07 Jún 2022, 01:02

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.
0
Naposledy upravil/-a romiadam v 07 Jún 2022, 08:03, upravené celkom 1 krát.
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2567
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa maskrtnik01 » 07 Jún 2022, 07:59

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?
0

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 07 Jún 2022, 10:52

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
Miko6005
Stály člen
Stály člen
Príspevky: 108
Dátum registrácie: 15 Dec 2018, 00:35

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa Miko6005 » 07 Jún 2022, 11:13

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.
Prílohy
SPI_LCD.TIF
(301.69 KiB) Zatiaľ žiadne stiahnutie
0
Nuclear battery for electric cars !!!

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 08 Jún 2022, 13:29

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.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Používateľov profilový obrázok
balu
Pokročilý člen
Pokročilý člen
Príspevky: 540
Dátum registrácie: 21 Feb 2022, 12:06

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa balu » 09 Jún 2022, 14:51

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.
0

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4418
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Nastaveie polarity CLK pre EEPROM (SPI)

Príspevok od používateľa romiadam » 10 Jún 2022, 01:28

Dakujem velmi pekne za vystizny vyklad.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok