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通过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