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.

TMS320F28377D: TMS320F28377D通过SPI访问FM25W256铁电读失败

Part Number: TMS320F28377D


你好,遇到如下问题,有会的帮忙解答一下,TMS320F28377D通过SPI访问FM25W256,读数据时一直返回0X00,通过示波器看过发送数据正常,就是读不到返回数据。代码如下:

初始化:

void SPI_B_init()

{

    SPI_disableModule(SPI_B_BASE);
    SPI_setConfig(SPI_B_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL1PHA1, SPI_MODE_CONTROLLER, 1000000, 8);
    SPI_setPTESignalPolarity(SPI_B_BASE, SPI_PTE_ACTIVE_LOW);
    SPI_disableLoopback(SPI_B_BASE);
    SPI_setEmulationMode(SPI_B_BASE, SPI_EMULATION_FREE_RUN);
    SPI_enableModule(SPI_B_BASE);

}

SPI驱动程序:

/****************************************
函数名称: Drv_Spi_WriteByte

函数描述: 向SPI模块发送缓存写入一个数据,spi_init中设置bit位数8

函数参数: base:SPIA/SPIB/SIPC; cData:待写入数据

函数返回: 无

******************************************/
void Drv_Spi_WriteByte(uint32_t base, uint8_t byte)
{
    uint16_t word;
    
    word = byte<<8;
    SPI_writeDataBlockingNonFIFO(base, word);
}

/****************************************
函数名称: Drv_Spi_ReadByte

函数描述: 从SPI模块接收缓存读取一个数据,spi_init中设置bit位数8

函数参数: base:SPIA/SPIB/SIPC

函数返回: uint8_t,

******************************************/
uint8_t Drv_Spi_ReadByte(uint32_t base)
{
    uint16_t word;
    
    SPI_writeDataBlockingNonFIFO(base, 0xff);
    word = SPI_readDataBlockingNonFIFO(base);
    
    return (uint8_t)(word&0xFF);
}

FRAM驱动程序:

#define DEBUG_FRAM_TEST 1 // 测试用

#define FM_WREN 0x06
#define FM_WRDI 0x04
#define FM_RDSR 0x05
#define FM_WRSR 0x01
#define FM_WRITE 0x02
#define FM_READ 0x03
#define FRAM_ADDR_MAX 0x7FFF

// Static functions Defines

// 使能写操作
static void s_Fram_WriteEnable(uint8_t en_disen);
// 写状态寄存器值
static void s_Fram_WriteSR(uint8_t val);
// 读状态寄存器
static uint8_t s_Fram_ReadSR(void);

// 使能写操作
static void s_Fram_WriteEnable(uint8_t en_disen)
{
    if (1 == en_disen)
    Drv_Spi_WriteByte(SPIB_BASE, FM_WREN);
    else
    Drv_Spi_WriteByte(SPIB_BASE, FM_WRDI);
}

// 写状态寄存器值
static void s_Fram_WriteSR(uint8_t val)
{
    s_Fram_WriteEnable(1);
    
    Drv_Spi_WriteByte(SPIB_BASE, FM_WRSR);
    Drv_Spi_WriteByte(SPIB_BASE, val);
}

// 读状态寄存器
static uint8_t s_Fram_ReadSR(void)
{
    s_Fram_WriteEnable(1);
    
    Drv_Spi_WriteByte(SPIB_BASE, FM_RDSR);
    return Drv_Spi_ReadByte(SPIB_BASE);
}

// Fram写数据
uint16_t Drv_Fram_Write(uint16_t addr, uint16_t *buffer, uint8_t length)
{
    uint8_t i;
    
    if (length==0 || (addr+length-1>FRAM_ADDR_MAX))
    return 0;
    
    // 写状态寄存器,取消位保护
    //s_Fram_WriteSR(0x80);
    // FRAM写使能
    s_Fram_WriteEnable(1);
    
    Drv_Spi_WriteByte(SPIB_BASE, FM_WRITE);
    Drv_Spi_WriteByte(SPIB_BASE, addr>>8);
    Drv_Spi_WriteByte(SPIB_BASE, addr&0xff);
    for (i=0; i<length; i++)
    {
        Drv_Spi_WriteByte(SPIB_BASE, buffer[i]);
    }
    
    // 保护存储块
    //s_Fram_WriteSR(0x8C);
    
    return 1;
}

// Fram读数据
uint16_t Drv_Fram_Read(uint16_t addr, uint16_t *buffer, uint8_t length)
{
    uint8_t i;
    
    if (length==0 || (addr+length-1>FRAM_ADDR_MAX))
    return 0;
    
    Drv_Spi_WriteByte(SPIB_BASE, FM_READ);
    Drv_Spi_WriteByte(SPIB_BASE, addr>>8);
    Drv_Spi_WriteByte(SPIB_BASE, addr&0xff);
    
    for (i=0; i<length; i++)
    {
        *buffer++ = Drv_Spi_ReadByte(SPIB_BASE);
    }
    
    return 1;
}

#ifdef DEBUG_FRAM_TEST
uint8_t fram_test(void)
{
    uint8_t l_write_buf[8] = {0xaa,0xab,0xac,0xad,0x11,0x22,0x33,0x44};
    uint8_t l_read_buf[2] = {0};
    uint8_t i;
    // uint8_t ret;
    uint16_t l_write_addr = 0x0033;
    static uint8_t s_rev = 0;
    
    //ret = s_Fram_ReadSR();
    if (s_rev ==0)
    {
        Drv_Fram_Write(l_write_addr, l_write_buf, 2);
        s_rev = 1;
    }
    else
    {
        Drv_Fram_Read(l_write_addr, l_read_buf, 2);
        s_rev = 0;
    }
    
    for (i=0; i<8; i++)
    {
        if (l_read_buf[i]!=l_write_buf[i])
        return 0;
    }
    
    return 1;
}

#endif