你好,遇到如下问题,有会的帮忙解答一下,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