• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users






Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#8
中級會員
中級會員


查看用戶資訊
根據我用25C040的結果 , 在一個 CS 拉 low 的情況下 :
是可以連續讀取資料的~
寫入可以不用寫滿一個 page , 我寫 2 個 byte 也可以寫進去~
以上 .... 使用心得

發表於: 2005/4/29 9:32
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#7
高級會員
高級會員


查看用戶資訊
關於 25AA256 有個問題請教~~~~

1.是否能連續讀取?(下位址後開始讀取 1byte,2byte....CS=1結束)

2,關於PAGE 寫入,是否每次一定要寫入 64byte ?,是否能寫入20byte後就結束?

發表於: 2005/4/29 2:30
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#6
中級會員
中級會員


查看用戶資訊
原來要多送一筆不相關的資料 , 當作 clock 的來源才可以 , 這樣我就懂了 ,
感謝版主的指導了 , 小弟受教了 ^^"

PS : 不是不想詳細的研讀 datasheet , 只是看完後的實作跟理想總有些差距 ,
非常感謝版主的指導 ~ 謝謝啦 ~

發表於: 2005/4/13 0:38
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#5
版主
版主


查看用戶資訊
看起來你還是對 SPI 沒有詳細去研讀它。25LC040 是屬於 Slave 的元件,它不可能自動發送資料到 Master 的。所以一定要 Master 發出 clock 訊號去將 Slave 的資料讀回來。

Master 最後送出 0xFF 的資料是屬於假讀取的動作,主要是藉由送出該筆資料時利用 clock 將 EEPROM 的資料讀回來。

所以最後一個 byte 送什麼都沒關係。

發表於: 2005/4/12 11:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#4
中級會員
中級會員


查看用戶資訊
小弟剛剛把程式改好 , 依照何板主的程式步驟來讀取 ,
先丟 read cmd , 在丟 adr , 接著丟 0xff ~
小弟不解為何要多丟一個 0xff ???
照理來說丟完 read cmd + adr 後 , EEPROM 自己要回應資料出來 , 只是這個時候 Master 沒有送出 clock , 本來想要自己畫出來 , 也畫不出來 , 是這個原因所以要送一筆空資料嗎 ? 若不送 0xff , 是否送其他的字元也可以 ?
還請版主指導一下 ~~ 感恩啦 !!

發表於: 2005/4/12 9:53
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#3
管理員
管理員


查看用戶資訊
以下有一個 使用 PIC18F452 讀取 25LC160 的 C 程式.
雖然不是 PIC16F877A , 但 C 程式應該很容易懂 .

#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 ;
}

發表於: 2005/4/11 14:35
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#2
版主
版主


查看用戶資訊
先看一下 AN966 的時序說明吧! 網址如下所示:

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

發表於: 2005/4/11 14:07
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


877A 讀取 25C040 沒辦法讀的到 , 請各位幫幫忙 ~
#1
中級會員
中級會員


查看用戶資訊
小弟對 SPI 讀取 25C040 不太熟 , 應該是程式寫錯了 ~
還請各位幫小底指導一下 !!
讀取 25C040 的時候 , 下指令時是否要先把 SS 拉 LOW 在下 READ 後在下 ADDRESS ?
小弟我是以 APP001 來做實驗 , 用示波器量測波形的時候只能看到 READ 跟 ADDRESS 的波形 , 第三組的 CLOCK 並沒有產生出來 , 可能因此收不到資料 , 原本小弟想用畫的把第三組的CLOCK 畫出來 , 可是沒辦法畫出來 , 可能是因為 SSP 模組啟動的關係 , 目前問題就卡在這裡 , 還請大家指導一下 !

程式如下 :

list p=16F877A
include <p16f877a.inc>

SPI_IN equ 0x26
SPI_OUT equ 0x27

org 0x0000
goto start
org 0x0300
start:
BANKSEL PORTA
BSF PORTA,4
BSF PORTA,5
BANKSEL SPI_IN
MOVLW 0X03
MOVWF SPI_IN
MOVWF SPI_OUT
CALL SPI_SEND

MOVLW 0X04
MOVWF SPI_IN
MOVWF SPI_OUT
CALL SPI_SEND

BANKSEL TRISC
BSF TRISC,4
NULL_LOOP:
GOTO NULL_LOOP


;===================================

SPI_SEND:
BANKSEL TRISC
CLRF TRISC
BSF TRISC,4 CLRF TRISB
CLRF TRISA

BANKSEL PORTA
CLRF PORTA
BSF PORTA,5
BANKSEL SSPSTAT
MOVLW B'01000000'
MOVWF SSPSTAT

BANKSEL SSPCON
MOVLW B'00100010'
MOVWF SSPCON

NOP
NOP

BANKSEL PORTA
BCF PORTA,5
ag1:
BANKSEL SSPBUF
movlw 0x03
MOVWF SSPBUF
btfss PIR1,3
goto $-1
clrf PIR1

ag2:
BANKSEL SSPBUF
movlw 0x09
MOVWF SSPBUF
btfss PIR1,3
goto $-1
clrf PIR1

BANKSEL SSPCON
BCF SSPCON,7

BANKSEL SSPSTAT
NO_OVER:
BTFSS SSPSTAT,0
GOTO NO_OVER
BANKSEL PORTA
BSF PORTA,5
RETURN

END


發表於: 2005/4/11 11:58
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... ]

教育訓練中心

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