Hirdetés

Új hozzászólás Aktív témák

  • don_peter

    senior tag

    Uraim, kérnék egy kis segítséget, hátha észreveszitek azt amin én már simán átsiklok.
    Hardver: (PIC18F4550 és 25LC640 memória IC)

    Csatoltam egy leegyszerűsített forrás fájlt.
    KB. 3 napja kínlódom vele és nem jövök rá mért nem azt csinálja amit szeretnék.
    A lényeg, hogy a memóriába szeretnék 1 32bájtos lapot beírni és ahelyett, hogy csak 1db 32bájtos lapot írna be a memória területre teleszemeteli a következő x*32bájtos területeket is.
    Azért mondom, hogy következő x*32bájtos területeket, mert szabályosan emelve a memória címzést kiolvasható ugyan az mint amit elmentettem a 0-ás címre.
    (8x32bájtig (256) egyformák a kiolvasott értékek, de mikor ugrik a 9x32bájtos (288) területre ott már 1bájtot csúszik visszafelé a memória címzés.)
    Utóbbit csak említettem, de nem érdekes most.
    Valaki esetleg látja azt a hibát ami ezt okozza?
    Előre is köszi..

    /*********************************************
    + K¸lsı f·jlok beemelÈse
    **********************************************/
    #include <p18F4550.h> //PIC be·llt·sa
    #include <stdio.h>
    #include <delays.h> //KÈsleltetÈsek
    #include <stdlib.h>
    #include "header.h" //¡lltal·nos header be·llÌt·sok
    #include "p18f4550_pindef.h" //P18F4550 saj·t definiciÛim
    #include "lcd.c" //LDC meghajt·s f¸ggvÈnyei

    /*********************************************
    + DefinciciÛk deklar·l·sa
    **********************************************/
    //-------------------------- DefinciciÛk ----------------------------//
    //PIC18F4550 SPI l·bkioszt·sa
    //7. (RA5)[SS - SPI m·sodlagos input v·lasztÛ]
    //33.(RBO)[SDI - SPI adat bemenet]
    //34.(RB1)[SCK - szinkron Ûra be/ki SPI mÛdban]
    //26.(RC7)[SDO - SPI adat kimenet]
    #define SPI_CS_TRIS TRIS_A5 //A5 chip v·laszt·s
    #define SPI_CS LAT_A5 //A5 chip v·laszt·s
    #define SPI_SO_TRIS TRIS_B0 //B0-·s bit
    #define SPI_SCK_TRIS TRIS_B1 //B1-es bit Ûrajel
    #define SPI_SI TRIS_C7 //C7 adat ki
    //-- A 25LC640 EEPROM ·ltal elfogadott parancsok
    #define CMD_WRSR 0x01 //St·tuszregiszter Ìr·sa
    #define CMD_WRITE 0x02 //Õr·s a megadott cÌmtıl kezdıdıen
    #define CMD_READ 0x03 //Olvas·s a megadott cÌmtıl kezdıdıen
    #define CMD_WRDI 0x04 //Letiltja az Ìr·st
    #define CMD_RDSR 0x05 //St·tuszregiszter olvas·sa
    #define CMD_WREN 0x06 //EngedÈlyezi az Ìr·st
    #define PMEMBLOCK 32
    /*********************************************
    + Union deklar·l·sa
    **********************************************/
    /*- 16bit-es UNION - (SPI memÛria cÌmzÈshez Ès 2 b·jtos (16bit-es) adatok t·rol·s·hoz kell)*/
    typedef union _union16 {
    unsigned int value;
    struct {
    unsigned char low;
    unsigned char high;
    };
    } union16;

    /*********************************************
    + PrototÌpusok
    **********************************************/
    void main(void); //Main()
    unsigned char spi_io(unsigned char adat); //SPI Ìr·s olvas·s
    void waitFor25LC640(void); //V·rakoz·s a SPI memÛri·ra
    void memWrite25LC640(union16 MemCim, unsigned char *pbuf); //MemÛria Ìr·sa
    void memRead25LC640(union16 MemCim, unsigned char *pbuf); //Meria olvas·sa

    void main(void){

    /*********************************************
    + V·ltozÛk deklar·l·sa
    **********************************************/
    union16 MemCim, ReadCim, AlsoFutes;
    unsigned char Membuffer[PMEMBLOCK+1] = {0};
    unsigned char x=0, i=0, z=0;

    /*********************************************
    + LCD inicializ·l·s
    **********************************************/
    TRISD = 0;
    lcd_init(); // Az LCD modulinicializ·l·sa
    stdout = _H_USER; // Az LCD legyen a standard kimenetnt
    /****************************LCD*************************************/

    /*********************************************
    + SPI init
    **********************************************/
    SPI_CS_TRIS = 0; //A5-es l·b kimenet
    SPI_CS = 1; //A5 l·b magas szinten
    SPI_SO_TRIS = 1; //B0 l·b SDI bemenet
    SPI_SCK_TRIS = 0; //B1 l·b SCK kimenet
    SPI_SI = 0; //C7 l·b SI kimenet
    SSPSTATbits.SMP = 0; //MintavÈtelezÈs idızÌtÈse Master mÛd esetÈn 1: mintavÈtelezÈs a kimeneti idı vÈgÈn, 0: mintavÈtelezÈs a kimeneti idı kˆzepÈn). Slave mÛdban kˆtelezıen null·ba kell ·llÌtani.
    SSPSTATbits.CKE = 0; //”rajel f·zis·nak be·llÌt·sa (1: az adatkimenet be·llÌt·sa akkor tˆrtÈnik,amikor az Ûrajel aktÌv ·llapotbÛl tÈtlenre v·lt, 0: az adatkimenet be·llÌt·sa akkor tˆrtÈnik, amikor az Ûrajel tÈtlen ·llapotbÛl aktÌv szintre v·lt)
    SSPSTATbits.BF = 0; //A buffer foglalts·g·t jelzı ·llapotbit (1: az adat·tvitel lezajlott, SSPBUF kiolvashatÛ, 0: az adatbuffer ¸res)
    SSPCON1bits.WCOL = 0; //‹tkˆzÈs detekt·l·s Ìr·sn·l (1: Ìr·st/adatk¸ldÈst kÌsÈrelt¸nk meg, amikor nem lehetett, 0: nincs ¸tkˆzÈs)
    SSPCON1bits.SSPOV = 0; //VÈteli t˙lcsordul·s-jelzı (1: ˙jabb b·jt Èrkezett, de SSPBUF meg nincs kiolvasva, 0: nincs t˙lfoly·s)
    SSPCON1bits.SSPEN = 1; //Master Szinkron Soros Port engedÈlyezÈse (1: engedÈlyezve, 0: letiltva)
    SSPCON1bits.CKP = 0; //”rajel polarit·sa (1: aktÌv ·llapotban alacsony szint, 0: aktÌv ·llapotban magas szint)
    SSPCON1bits.SSPM0 = 0;
    SSPCON1bits.SSPM1 = 1;
    SSPCON1bits.SSPM2 = 0;
    SSPCON1bits.SSPM3 = 0;

    //BeÌ·r·s ut·n ki kell kommentelni-------------------------------------
    /*Membuffer[0] = '#';
    Membuffer[1] = 'D';
    Membuffer[2] = 'P';
    Membuffer[3] = 'T';
    Membuffer[4] = 'P';
    Membuffer[5] = ' ';
    Membuffer[6] = ' ';
    Membuffer[7] = ' ';
    Membuffer[8] = ' ';
    Membuffer[9] = ' ';
    Membuffer[10] = ' ';
    Membuffer[11] = ' ';
    Membuffer[12] = ' ';
    Membuffer[13] = ' ';
    Membuffer[14] = ' ';
    Membuffer[15] = ' ';
    Membuffer[16] = ' ';
    Membuffer[17] = ' ';
    Membuffer[18] = 60;
    Membuffer[19] = 61;
    Membuffer[20] = 120;
    Membuffer[21] = 62;
    Membuffer[22] = 160;
    Membuffer[23] = 63;
    Membuffer[24] = 200;
    Membuffer[25] = 64;
    Membuffer[26] = 220;
    Membuffer[27] = 65;
    Membuffer[28] = 250;
    Membuffer[29] = 66;
    AlsoFutes.value = 500;
    Membuffer[30] = AlsoFutes.low;
    Membuffer[31] = AlsoFutes.high;
    Membuffer[32] = '\0';

    //2 memÛria blokk feltˆltÈse
    MemCim.value = 0;
    memWrite25LC640(MemCim, Membuffer);

    //MemCim.value += PMEMBLOCK; //32
    //memWrite25LC640(MemCim, Membuffer);

    memset(Membuffer, 0, sizeof(Membuffer)); //Null·zzuk Membuffer-t
    //BeÌ·r·s ut·n ki kell kommentelni------------------------------------
    */
    //Kiolvassuk a memÛria tartam·t
    MemCim.value = 0;
    do{
    memRead25LC640(ReadCim, Membuffer);
    ReadCim.value += PMEMBLOCK;
    for(i=0; i<PMEMBLOCK; i++){
    if(Membuffer[i]=='#'){ z++; }
    printf("%i - %02i - 0x%x ", x, ReadCim.value-PMEMBLOCK, ReadCim.value-PMEMBLOCK);
    lcd_write(0xC0,0,1,1);
    printf("Talalat(#): %i ", z);
    lcd_write(0x94,0,1,1);
    printf("H:%i - L:%i ", ReadCim.high, ReadCim.low);
    lcd_write(0xD4,0,1,1);
    printf("%i~%c ", i, Membuffer[i]);
    lcd_write(0x80,0,1,1);
    Delay10KTCYx(10);
    }
    memset(Membuffer, 0, sizeof(Membuffer));
    x++;
    }while(x<15); //Amennyi lapot akarunk, annyit olvasunk ki
    Delay10KTCYx(100);

    while(1);

    }//main

    /*********************************************
    + SPI 25LC640 memÛria
    **********************************************/
    unsigned char spi_io(unsigned char adat){
    unsigned char tmp;
    SSPSTATbits.BF = 0; // tˆrli foglalts·g jelzı ·lapot·t a st·tusz regiszterben
    SSPCON1bits.WCOL = 0; // tˆrli az esetleges Ìr·s ¸tkˆzÈs hibajelzıt
    tmp = SSPBUF; // tˆrli a BF jelzıbitet
    SSPBUF = adat; // kirakja a kimenı adatot az SSPBUF regiszterbe
    while(!SSPSTATbits.BF); // megv·rjuk a busz ciklus vÈgÈt
    return (SSPBUF); // a vett b·jttal tÈr¸nk vissza
    }

    void waitFor25LC640(void) {
    unsigned int flag;
    do {
    SPI_CS = 0; //kiadjuk a Chip Enable jelet
    spi_io(CMD_RDSR); //St·tuszregiszter olvas·sa parancs
    flag = spi_io(0x00); //Olvasunk, de valamit akkor is k¸ldeni kell!
    SPI_CS = 1; //megsz¸ntetj¸k a Chip Enable jelet
    } while (flag & 0x01);
    }

    void memWrite25LC640(union16 MemCim, unsigned char *pbuf) {
    unsigned char i,flag;
    waitFor25LC640(); //V·runk, ha az EEPROM elfoglalt
    SPI_CS = 0;
    WriteSPI(CMD_WREN); //Õr·s ˙jraengedÈlyezÈse
    SPI_CS = 1;
    Delay10KTCYx(1);
    SPI_CS = 0;
    spi_io(CMD_WRITE); //Adatblokk Ìr·sa
    spi_io(MemCim.low);
    spi_io(MemCim.high);
    for (i=0; i < PMEMBLOCK; i++) {
    spi_io(*pbuf++); //Az adatbuffer kiÌr·sa
    }
    SPI_CS = 1;
    }

    void memRead25LC640(union16 MemCim, unsigned char *pbuf) {
    unsigned char i;
    waitFor25LC640(); //V·runk, ha az EEPROM elfoglalt
    SPI_CS = 0;
    spi_io(CMD_READ); //Adatblokk olvas·sa
    spi_io(MemCim.low);
    spi_io(MemCim.high);
    for (i=0; i < PMEMBLOCK; i++) {
    *pbuf++=spi_io(0x00); //Olvasunk, de valamit akkor is k¸ldeni kell!
    }
    SPI_CS = 1;
    }

    [ Szerkesztve ]

    ----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----

Új hozzászólás Aktív témák