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的配置参照官方的历程,以下是驱动的程序:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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,
};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以下是发收8字节的函数

Fullscreen
1
2
3
4
5
6
7
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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以下是应用读写部分程序

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* */
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

附件图片1

附件图片2

附件图片3