• slider image 514
  • slider image 516
  • slider image 517
  • slider image 518
  • slider image 519
:::


Browsing this Thread:   1 Anonymous Users






Re: 奇怪!25LC640在怎麼用都不會動??
#5
版主
版主


查看用戶資訊
不規則階梯波? 感覺 SO 是否輸出打架了???

發表於: 2006/5/9 23:11
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 奇怪!25LC640在怎麼用都不會動??
#4
新會員
新會員


查看用戶資訊
首先謝謝各位前輩提供資料幫我修正寫程式的方向!

不過,想請教各位前輩的是.......
再讀取25LC640時,為什麼SO出來的訊號並不像資料上秀出來的波形那樣的乾淨,而是類似不規則階梯的波形.............

不知道是怎麼一回事,可否再請教各位前輩!!!

謝謝......

發表於: 2006/5/9 15:26
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 奇怪!25LC640在怎麼用都不會動??
#3
版主
版主


查看用戶資訊
何仁杰有寫對 25LC160的範例程式,post 出來供有需要的人參考:
#include <p18F452.h>

/*    --------------------------------------------------------------------------------------------------------------------
    Program : PIC18F_SPI1.c
    Purpose : Demonstrate that how to use H/W SPI interface of PIC18F452 to Read/Write 25LC160(A)
    Subroutine provided :     Byte Write            SPIEEPROM_Byte_Write( )
                            Byte Read            SPIEEPROM_Byte_Read( )
                            Page Write            SPIEEPROM_Page_Write( )
                            Multi-Byte Read        SPIEEPROM_MultiByte_Read( )

    User can use APP001 EVM Board with PIC18F452 to evaluate this program ! 
    >> Close all jumpers of J9
    >> Open all jumpers of J10

    THIS SOFTWARE IS PROVIDED IN AN S IS?CONDITION. NO WARRANTIES,
     WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
     TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
     IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
    -------------------------------------------------------------------------------------------------------------------- */
#define    SPI_CS                    PORTAbits.RA5 
#define    SPIEEPROM_RDSR        0b00000101 
#define    SPIEEPROM_WRSR    0b00000001 
#define    SPIEEPROM_WREN    0b00000110 
#define    SPIEEPROM_WRDI    0b00000100
#define    SPIEEPROM_WRITE    0b00000010
#define    SPIEEPROM_READ    0b00000011

/*    ----------------------------------------------------------------------------------------------------------------------
    Important information when using SPI EEPROM which supports page-Write 
    Example :    Page for 25LC160 & 25LC160A is 16 Bytes
                Page for 25LC160B is 32 Bytes 
                Don'y cross page boundry !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ----------------------------------------------------------------------------------------------------------------------        */

//     #define        _25LC160B                                // Remark this line when using 25LC160 or 25LC160A
#if defined    _25LC160B
#define        SPIEEPROM_PAGE     32
#else        
#define        SPIEEPROM_PAGE    16
#endif    

void                SPI_Initialvoid ) ;
void             SPIEEPROM_Byte_Writeint  unsigned char ) ;
unsigned char     SPIEEPROM_Byte_Read ( int ) ; 
void                SPIEEPROM_CMD_Write unsigned char ) ;
void                SPIEEPROM_Wenvoid ) ;
void                SPIEEPROM_SetModevoid ) ;
unsigned char     SPIEEPROM_Busyvoid ) ;
void             SPIEEPROM_MultiByte_Readint unsigned char unsigned char * ) ;
unsigned char      SPIEEPROM_Page_Writeint unsigned char unsigned char * ) ;

unsigned char    SPI_Buf[32] ; 

union
    
{
        
int                WordVal ;
        
unsigned char    ByteVal[2] ;
    }     
Word2Bytes ;

void main(void)
{
    
ADCON1 0b00001110 ;        // Only RA0 is AD 
    
TRISA 0xff ;

    
TRISD 0x00 ;
    
PORTD 0x00 ;

    
SPI_Initial( ) ;

while ( 
)
    {

    
int        Loop_Index ;

            
SPIEEPROM_SetMode( ) ;                                        // Un-Protect whole device !! 

        
for ( Loop_Index Loop_Index 16 Loop_Index ++ )                // Initial the data @ SPI_Buf 
            
SPI_Buf[Loop_Index] = ( Loop_Index << ) + 1  ;

                
SPIEEPROM_Page_Write( ( int) 0x00 16 SPI_Buf ) ;

                
SPIEEPROM_MultiByte_Read( (int)0x00 16 SPI_Buf ) ;
 
                while (
) ;                                                    // Endless Loop @ here !! 
    
}
}

void        SPI_Initial void )
{
    
TRISAbits.TRISA5 ;        // RA5 = output
    
SPI_CS ;
    
TRISCbits.TRISC5 ;        // SDO
    
TRISCbits.TRISC3 ;        // SCK
    
TRISCbits.TRISC4 ;        // SDI 
    
SSPSTAT 0b01000000 ;
    
SSPCON10b00100010 ;
}

void     SPIEEPROM_Wenvoid 
{
            
SPI_CS ;
            
SPIEEPROM_CMD_WriteSPIEEPROM_WREN ) ;         // Enable for Write !!
            
SPI_CS ;

            while ( 
SPIEEPROM_Busy( ) ) ;
}

void            SPIEEPROM_SetMode(  void 
{
            
SPIEEPROM_Wen( ) ;

            
SPI_CS ;
            
SPIEEPROM_CMD_WriteSPIEEPROM_WREN ) ;         // Enable for Write !!
            
SPIEEPROM_CMD_Write0b00000000 ) ;
            
SPI_CS ;

            while ( 
SPIEEPROM_Busy( ) ) ;
}


unsigned char   SPIEEPROM_Busyvoid  )
{
        
unsigned char    SPIEEPROM_Status ;

            
SPI_CS ;
                
SPIEEPROM_CMD_WriteSPIEEPROM_RDSR ) ;
                    
SPIEEPROM_CMD_Write0xff ) ;
            
SPI_CS ;

            
SPIEEPROM_Status SSPBUF  ;
            if ( 
SPIEEPROM_Status 0b00000001 )
                    return 
;
            else
                    return 
;
}

void SPIEEPROM_CMD_Writeunsigned char SPI_Cmd)
{
        
SSPBUF SPI_Cmd ;
        while      ( ! 
PIR1bits.SSPIF ) ;
                
PIR1bits.SSPIF ;
}

void SPIEEPROM_Byte_Writeint W_Address unsigned char W_Data 
{
        
Word2Bytes.WordVal W_Address ;

        
SPIEEPROM_Wen( ) ;

        
SPI_CS ;

        
SPIEEPROM_CMD_WriteSPIEEPROM_WRITE ) ;                    // Write Command
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[1] ) ;                    // Write Address High Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[0] ) ;                    // Write Address Low Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteW_Data ) ;                                    // Write Data to EEPROM
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;

        
SPI_CS ;
}

unsigned char SPIEEPROM_Byte_Readint R_Address 
{
        
Word2Bytes.WordVal R_Address ;                            // 使用 union 來做 Word & Bytes 的轉換
        
        
SPI_CS ;

        
SPIEEPROM_CMD_WriteSPIEEPROM_READ ) ;                                // Write Read Command
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[1] ) ;                    // Write Address High Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[0] ) ;                    // Write Address Low Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_Write0xff ) ;                                        // Use Dummy output and get data from EEPROM
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;

        
SPI_CS ;

        return ( 
SSPBUF) ;
}

void     SPIEEPROM_MultiByte_Readint R_Address unsigned char Byte_Number unsigned char *ReadBuffer 
{
        
unsigned char Read_Loop ;

        
Word2Bytes.WordVal R_Address ;                            // 使用 union 來做 Word & Bytes 的轉換
        
        
SPI_CS ;

        
SPIEEPROM_CMD_WriteSPIEEPROM_READ ) ;                    // Write Read Command
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[1] ) ;                    // Write Start Address High Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[0] ) ;                    // Write Start Address Low Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;

        for ( 
Read_Loop Read_Loop Byte_Number Read_Loop ++ ) 
        {
            
SPIEEPROM_CMD_Write0xff ) ;                                        // Use Dummy output and get data from EEPROM
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
            *
ReadBuffer ++ = SSPBUF ;
        }

        
SPI_CS ;
}

unsigned char      SPIEEPROM_Page_Writeint W_Address unsigned char Byte_Number unsigned char *WriteBuffer  
{
        
unsigned char     Write_Loop ;
        
int                Check_Address ;
        
        
// Check the page boundry ............................................................................
        // Return 1 if out of page boundry ................................................................

        
Check_Address W_Address -  ( W_Address % (int)16 ) ;
        
Check_Address += 16 ;

        if ( (
W_Address Byte_Number ) > Check_Address )        return ;

        
// End of page boundry checking ................................................................

        
Word2Bytes.WordVal W_Address ;

        
SPIEEPROM_Wen( ) ;

        
SPI_CS ;

        
SPIEEPROM_CMD_WriteSPIEEPROM_WRITE ) ;                    // Write Command
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[1] ) ;                    // Write Address High Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
SPIEEPROM_CMD_WriteWord2Bytes.ByteVal[0] ) ;                    // Write Address Low Byte
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        
        for ( 
Write_Loop Write_Loop Byte_Number Write_Loop++ )
        {
            
SPIEEPROM_CMD_Write( *WriteBuffer ++ ) ;                        // Write Data to EEPROM
            
while ( PIR1bits.SSPIF) ;        PIR1bits.SSPIF ;
        }

        
SPI_CS ;

                        while ( 
SPIEEPROM_Busy( ) ) ;                            // Wait until Write Complete !!
                        
return ;
}

發表於: 2006/5/8 18:08
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 奇怪!25LC640在怎麼用都不會動??
#2
版主
版主


查看用戶資訊
這裡有一些 SPI ERPROM 的存取範例,如果不敢確定資料是否有寫入可以先用一個 EEPROM writer 先寫入一些固定 Pattern 在特定位址後,再用你寫的程式去讀它已確定工作模式是否正確(一般是以 Mode 0,0)。

http://www.microchip.com/stellent/idc ... &nodeId=1490&filterID=395

發表於: 2006/5/8 17:41
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


奇怪!25LC640在怎麼用都不會動??
#1
新會員
新會員


查看用戶資訊
各位前輩:
目前使用PIC16F74的MCU來驅動25LC640去存取資料,硬體線路如下:
25LC640 PIC16F74
CS --------------------> PORTE.1
WP(VCC)
HOLD(VCC)
SCK ------------------> PORTC.3(SCK)
SI --------------------> PORTC.5(SDO)
SO -------------------> PORTC.4(SDI)
VCC(+5V)
VSS(GND)

軟體程式撰寫如下
CALL EEPROM_WRITE_ENABLE
(根據 WRITE DISABLE SEQUENCE 時序圖)
CALL INITIAL_EEPROM
(WPEN=0,BP1=0,BP0=0,WEL=1,WIP=X)
CALL EEPROM_WRITE_DISABLE
(根據 WRITE ENABLE SEQUENCE 時序圖)
CALL READ_STATUS_REGISTER
(根據 READ STATUS REGISTER SEQUENCE 時序圖)

結果不知道是沒有寫進去或是讀不到,SO PIN都出現不是預期的不規則訊號................
煩請有經驗之前輩能夠協助我解決問題!

發表於: 2006/5/6 17:05
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------