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.

MSPM0G3507: MSPM0G3507评估板-调试SPI功能-抓取时序正确-读取的数据却错误

Part Number: MSPM0G3507


你好!

      我这边用MSPM0G3507评估板进行SPI通讯调试,利用J-LINK下载程序,内部时钟使用默认的32M,SPI的配置参照官方的历程,以下是驱动的程序:

void DL_SPI_1_GPIO_Config(void)
{
DL_GPIO_initPeripheralOutputFunction(
GPIO_SPI_1_IOMUX_SCLK, GPIO_SPI_1_IOMUX_SCLK_FUNC);
DL_GPIO_initPeripheralOutputFunction(
GPIO_SPI_1_IOMUX_PICO, GPIO_SPI_1_IOMUX_PICO_FUNC);
DL_GPIO_initPeripheralInputFunction(
GPIO_SPI_1_IOMUX_POCI, GPIO_SPI_1_IOMUX_POCI_FUNC);
DL_GPIO_initPeripheralOutputFunction(
GPIO_SPI_1_IOMUX_CS0, GPIO_SPI_1_IOMUX_CS0_FUNC);
}


static const DL_SPI_Config gSPI_1_config = {
.mode = DL_SPI_MODE_CONTROLLER,
.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA1,
.parity = DL_SPI_PARITY_NONE,
.dataSize = DL_SPI_DATA_SIZE_8,
.bitOrder = DL_SPI_BIT_ORDER_MSB_FIRST,
.chipSelectPin = DL_SPI_CHIP_SELECT_0,
};

static const DL_SPI_ClockConfig gSPI_1_clockConfig = {
.clockSel = DL_SPI_CLOCK_BUSCLK,
.divideRatio = DL_SPI_CLOCK_DIVIDE_RATIO_8,
};

SYSCONFIG_WEAK void SYSCFG_DL_SPI_1_init(void) {
DL_SPI_setClockConfig(SPI_1_INST, (DL_SPI_ClockConfig *) &gSPI_1_clockConfig);

DL_SPI_init(SPI_1_INST, (DL_SPI_Config *) &gSPI_1_config);

DL_SPI_setBitRateSerialClockDivider(SPI_1_INST, 3);

DL_SPI_setDelayedSampling(SPI_1_INST,3);
// DL_SPI_enableLoopbackMode(SPI_1_INST);

/* Set RX and TX FIFO threshold levels */
DL_SPI_setFIFOThreshold(SPI_1_INST, DL_SPI_RX_FIFO_LEVEL_1_2_FULL, DL_SPI_TX_FIFO_LEVEL_1_2_EMPTY);

/* Enable module */
DL_SPI_enable(SPI_1_INST);

}

以下是发收8字节的函数

u8 SPI_FLASH_SendByte(u8 byte)
{
static u8 data8_temp;
DL_SPI_transmitDataBlocking8(SPI_1_INST, byte);
DL_SPI_receiveDataCheck8(SPI_1_INST, &data8_temp);
return data8_temp;
}

以下是和W25QXX-SPI芯片通讯的读写函数

void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;

Addr = WriteAddr % SPI_FLASH_PageSize;
count = SPI_FLASH_PageSize - Addr;
NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned */
{
if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
}
else /* NumByteToWrite > SPI_FLASH_PageSize */
{
while (NumOfPage--)
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
WriteAddr += SPI_FLASH_PageSize;
pBuffer += SPI_FLASH_PageSize;
}

SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
}
else /* WriteAddr is not SPI_FLASH_PageSize aligned */
{
if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
{
if (NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
{
temp = NumOfSingle - count;

SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;

SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
}
else
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
}
}
else /* NumByteToWrite > SPI_FLASH_PageSize */
{
NumByteToWrite -= count;
NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;

while (NumOfPage--)
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
WriteAddr += SPI_FLASH_PageSize;
pBuffer += SPI_FLASH_PageSize;
}

if (NumOfSingle != 0)
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
}
}
}



void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)
{
/* Select the FLASH: Chip Select low */
SPI_FLASH_CS_LOW();

/* Send "Read from Memory " instruction */
SPI_FLASH_SendByte(W25X_ReadData);

/* Send ReadAddr high nibble address byte to read from */
SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
/* Send ReadAddr medium nibble address byte to read from */
SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
/* Send ReadAddr low nibble address byte to read from */
SPI_FLASH_SendByte(ReadAddr & 0xFF);

while (NumByteToRead--) /* while there is data to be read */
{
/* Read a byte from the FLASH */
*pBuffer = SPI_FLASH_SendByte(Dummy_Byte);
/* Point to the next location where the byte read will be saved */
pBuffer++;
}

/* Deselect the FLASH: Chip Select high */
SPI_FLASH_CS_HIGH();
while(DL_SPI_isBusy(SPI_1_INST)){};
}

以下是应用读写部分程序

/* 发送缓冲区初始化 */
uint8_t Tx_Buffer[10] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x91};
uint8_t Rx_Buffer[10];
#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress

int main(void)
{
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();

SysTick_Init(32);


while (1) {
time_proc();

if ( 1 == TimeDisplay1s_Test )//每过1s刷新
{
TimeDisplay1s_Test = 0;

/* Erase SPI FLASH Sector to write on */
SPI_FLASH_SectorErase(FLASH_SectorToErase);
/* 将发送缓冲区的数据写到flash中 */
SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, 10);
/* 将刚刚写入的数据读出来放到接收缓冲区中 */
SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, 10);
}
}
}

编译后进行仿真,发现Rx_Buffer[10]存数据的数组里面的数据不是写入的数据,见附件图片1;但逻辑分析仪分析出来的时序却是正确的,见附件图片2和附件图片3;

我这边考虑会不会是读取数据的时候出错了,应该怎么去读取数据呢?谢谢!

附件图片1

附件图片2

附件图片3