This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28035如何透過spi存取外部記憶體

我要对外部的EEPROM进行数据的读写,有无范例程式可供参考?

我的DSP是F28035、EEPROM是25LC320A、界面是SPI

DSP与EEPROM的联接关系是

DSP的脚位配置如下

  • 你好,目前TI没有基于SPI的外部扩展存储例程,只有基于I2C的EEPROM外扩例程。这方面可能需要自己开发了
  • waveform1是写入的波形,感觉上,F28035在数据写入SPITXBUF后不久(有点延迟时间),就下拉CS,将数据发出后,就上拉CS,如此反复。我用的EEPROM是Michochip的25AA320A,它的写入波形式(waveform2),其clock是连续打出,请问是否是我设定的问题,造成F28035的SPI周边的CS是如此表现,(我曾经试图自行下拉CS,但无效果,CS信号还是由SPI周边所控制)

    该如何修正?

    main program

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include "DSP28x_Project.h" // Device Headerfile and Examples Include File
    #include "SI_GUI_Main.h"
    void main(void) {
    Uint16 eeprom_data = 0x55;
    Uint16 eeprom_d1;
    Uint16 eeprom_addr = 0x03;
    setupDevice(); //will call setup_EEPROM_SPI
    read_EEPROM_Status();
    while (1){
    addrwrite_EEPROM(eeprom_addr,eeprom_data);
    eeprom_d1 = addrread_EEPROM(eeprom_addr);
    }
    }
    void Test() {
    char Message[9] = "W Grid "; //�dz��ഫ���ֺ�e�q�Ҧ�
    IBDC_PowerGeneration = 25 | 0x8000; //MSB�]��1����F�o�q�q 25*0.1kW = 2.5kW
    INV_PowerGeneration = 30 | 0x8000; //MSB�]��1����F�o�q�q 30*0.1kW = 3.0kW
    PV_PowerGeneration = 50; //�S�����t���F�o�q�q 50*0.1kW = 5.0kW
    PVINV_ErrCode = 123; //���~�X�|�H10�i����ܡG123
    PVINV_WarningCode = 567; //ĵ�ܽX�|�H10�i����ܡG567
    IBDC_ErrCode = 135; //���~�X�|�H10�i����ܡG135
    IBDC_WarningCode = 246; //ĵ�ܽX�|�H10�i����ܡG246
    Display_Msg(Message);
    }
    void ErrCode(void){
    if (PVINV_ErrCode || IBDC_ErrCode) {//�p�G������o�X���~�X
    if (PVINV_ErrCode >= PVINV_ERROR_NUMBER-1) PVINV_ErrCode = PVINV_ERROR_NUMBER-1;
    if (IBDC_ErrCode >= IBDC_ERROR_NUMBER-1) IBDC_ErrCode = IBDC_ERROR_NUMBER-1;
    LcmF=1;
    ErrCounter++;
    }
    else
    while(ErrCounter>=1 & PVINV_ErrCode==0 & IBDC_ErrCode==0){
    if(ErrCounter!=0)
    LCD_Display(PVINV_ErrorMsg[PVINV_ErrCode], IBDC_ErrorMsg[IBDC_ErrCode]);
    if (!bScanKeyTrigger) {KeyEvent = KeyEvent_Shadow; KeyEvent_Shadow = KEYEVENT_NO_EVENT;}
    if(KeyEvent==6){
    LcmF=0;
    ErrCounter=0;
    init_SI_GUI();
    return;
    }
    if (KeyEvent != KEYEVENT_NO_EVENT) {bScanKeyTrigger = 1; KeyEvent = KEYEVENT_NO_EVENT;}
    }
    }
    void System_Oper(void){
    if(LcmF==1){return;}
    //���s����ƥ�A�h��s����ƥ�
    if (!bScanKeyTrigger) {KeyEvent = KeyEvent_Shadow; KeyEvent_Shadow = KEYEVENT_NO_EVENT;}
    if (ModeSel_Action_F) {
    if (KeyEvent != KEYEVENT_NO_EVENT) {//����LMenu_ModeSel_Action()�S���F����F
    ModeSel_Action_F = 0; bScanKeyTrigger = 1; KeyEvent = KEYEVENT_NO_EVENT;
    } else return;
    }
    switch (nFuntionIndex) {//���ާ@�G���n�M������ƥ�A���U�|�B�z
    case _Menu_EntryPoint_Index: Menu_EntryPoint(); break;
    case _Menu_ModeParaSel_Index: Menu_ModeParaSel(); break;
    case _Menu_ModeSel_Index: Menu_ModeSel(); break;
    case _Menu_ParaSet_Index: Menu_ParaSet(); break;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    SPI API file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include "SI_GUI_Spi.h"
    #include "DSP2803x_Device.h" // DSP28 Headerfile Include File
    #include "DSP2803x_Examples.h" // DSP28 Examples Include File
    #include "common.h"
    #define EEPROM_CS GpioDataRegs.GPADAT.bit.GPIO19
    #define RDSR 0b00000101 // RDSR command
    #define WREN 0b00000110 // WREN command
    #define WRITE 0b00000010 // WRITE command
    #define READ 0b00000011 // READ command
    void spi_init(void);
    Uint16 spi_xmit(int a);
    void setup_EEPROM_SPI(void) {
    InitSpiaGpio();
    spi_init();
    }
    void spi_init(void) {
    SpiaRegs.SPICCR.all = 0x0007; //Data is ready on rising edge), loopback is off, 8-bit data
    SpiaRegs.SPICTL.all = 0x000E; //Normal SPI clocking scheme(Data in latch on rising edge)master, 4-pin option, No interrupt
    SpiaRegs.SPIBRR = 0x0077; //BateRate 0.5MHz
    SpiaRegs.SPICCR.all = 0x0087; //SPI is ready to transmit or receive the next character.
    SpiaRegs.SPIPRI.bit.FREE = 1;
    //EEPROM_CS = 1;
    }
    void read_EEPROM_Status(void) {
    //EEPROM_CS = 0;
    DELAY_US(1);
    spi_xmit(RDSR);
    //EEPROM_CS = 1;
    DELAY_US(100);
    }
    Uint16 spi_xmit(int a) {
    Uint16 Ret_var = 0;
    SpiaRegs.SPITXBUF = (a<<8);
    while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
    Ret_var = SpiaRegs.SPIRXBUF<<8;
    return Ret_var;
    }
    void addrwrite_EEPROM(Uint16 address,Uint16 Data) {
    int addrH,addrL;
    addrH = 0;
    addrL = 0;
    addrH = (address>>8);
    addrL = (address&0x00FF);
    //write sequence..
    // EEPROM_CS = 0;
    DELAY_US(1);
    spi_xmit(WREN);
    // EEPROM_CS = 1;
    DELAY_US(1);
    // EEPROM_CS = 0;
    DELAY_US(1);
    spi_xmit(WRITE);
    spi_xmit(addrH);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    waveform1

    waveform2

  • 非常抱歉,本人没有SPI读写外部存储器的操作经验。建议你前往E2E英文论坛咨询相关问题:e2e.ti.com/.../171