工具/软件:Starterware
尊敬的所有人:
我 的 SPI 有两个问题、用于两个 TMS570LS0714 通信。
下面的 H/W 连接: 一个主器件、一个从器件。 SIMO->SIMO、SOMI->SOMI、CLK->CLK、无其它。
下面的程序思想: 主机在1ms 中断(HET 中断、运行良好)内发送数据[20]和接收数据[20]。从机在1ms 中断(HET 中断、运行良好)内发送数据[20]和接收数据[20]。
但主机可以发送数据(校验寄存器)、而不是接收数据。 从器件都不能。 检查从机寄存器,Flg 寄存器为0x340表示溢出。 当我手动清除0x340时,我可以看到从机 只发送和接收一个数据,然后 FLG 为0x340。
我不知道如何解决这个问题,请帮我。
我的以下代码:
主器件:
void _InitSpi3 (spiBASE-t * SpiInfo)
{
/*@b 初始化@b SPI3 */
/**使 SPI 退出复位*/
SpiInfo->GCR0 = 1U;
/** SPI2主控模式和时钟配置*/
SpiInfo->GCR1 =(1 << 1)/* CLOKMOD */
|1;/*主设备*/
/** SPI3使能引脚配置*/
// spiREG3->ENAHIGHZ = 0;//启用 HIGHZ *//lugh 测试
/**-延迟*/
SpiInfo->Delay =(4 << 24)/* C2TDELAY */
|(4 << 16)/* T2CDELAY */
|(0 << 8)/* T2EDELAY */
| 0;// C2EDELAY */
/**-数据格式0 */
SpiInfo->FMT0 =(63 <<24)/* wdelay */
|(0 << 23)/*奇偶极性*/
|(0 << 22)/*奇偶校验使能*/
|(0 << 21)//等待启用*/
|(0 < 20)/*换向*/
|(0 < 17)/*时钟极性*/
|(0 < 16)/*时钟相位*/
|(79 << 8)/*波特率预分频、1M Hz *//lugh
//|(7 << 8)//*波特率预分频,10M Hz */
|16;/*数据字长度*/
/**-设置中断级别*/
SpiInfo->LVL =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */
/**-清除所有挂起的中断*/
SpiInfo->FLG = 0xFFFFFFU;
/**-启用中断*/
SpiInfo->INT0 =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */
/**@b 初始化@b SPI3 @b 端口*/
/**- SPI3端口输出值*/
SpiInfo->PC3 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/**- SPI3端口方向*/
SpiInfo->PC1 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(0 < 11);/* SOMI */
/**- SPI3端口开漏使能*/
SpiInfo->PC6 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/**- SPI3端口上拉/下拉选择*/
SpiInfo->PC8 = 1/* SCS[0]*/
|(1 << 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */
/**- SPI3端口上拉/下拉使能*/
SpiInfo->PC7 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/* SPI2将所有引脚设置为功能*/
SpiInfo->PC0 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */
/**-初始化 TX 和 RX 数据缓冲区状态*/
G_spiPacket_t[0].TX_DATA_STATUS = SPI_READY;
G_spiPacket_t[0].Rx_DATA_STATUS = SPI_READY;
/*用于 EM 配置的 EmbDataRegCfg。 *
EMDataRegCfg.CSNR = 1;
EMDataRegCfg.CS_HOLD = 1;
EMDataRegCfg.DFSEL = SPI_FMT_0;
EMDataRegCfg.WDEL = 1;
/**-最后启动 SPI3 */
SpiInfo->GCR1 |=(uint32)((uint32) 1U <<24U);/* SPI3启用*/
}
UINT32 SPI_TransmitAndReceiveData (spiBASE-t * SPI、UINT32块大小、
uint16 * srcbuff、uint16 * destbuff)
{
静态 uint16 Tx_Data;
uint16 RecvCnt=0;/*接收等待时间计数。 *
静态 uint16缓冲头标志= 0;/*接收头数据结束标志。 *
while (blocksize!= 0U)
{
if ((SPI->FLG & 0x000000FFU)!= 0U)/*出错。*/
{
中断;
}
TX_Data =* srcbuff;
SPI->DAT1 =(SPI->DAT1 & 0xFFFF0000U)|((UINT32) Tx_Data);
srcbuff +;
while ((SPI->FLG & 0x00000100U)!= 0x00000100U)
{
RecvCnt++;
// if (RecvCnt >= 500)
//{
//中断;
//}//lugh
}/*等待*/
*缓冲区=(uint16)(SPI->BUF & 0xFFFFFFU);
if ((blocksize =20)&&(* destbuff ==0xAAAA))//lugh
{
BufferHeadFlag = 1;
}
if (缓冲头标志= 1)
{
减持器++;
}
块大小----
}
BufferHeadFlag = 0;
返回(SPI->FLG & 0xFFU);
}
从属方:
void _InitSpi3 (spiBASE-t * SpiInfo)
{
/*@b 初始化@b SPI3 */
/**使 SPI 退出复位*/
SpiInfo->GCR0 = 1U;
/** SPI2主控模式和时钟配置*/
SpiInfo->GCR1 =(0 << 1)/* CLOKMOD *//lugh
| 0;/*从器件*/
/** SPI3使能引脚配置*/
// spiREG3->ENAHIGHZ = 0;//启用 HIGHZ *//lugh 测试
/**-延迟*/
SpiInfo->Delay =(4 << 24)/* C2TDELAY */
|(4 << 16)/* T2CDELAY */
|(0 << 8)/* T2EDELAY */
| 0;// C2EDELAY */
/**-数据格式0 */
SpiInfo->FMT0 =(63 <<24)/* wdelay */
|(0 << 23)/*奇偶极性*/
|(0 << 22)/*奇偶校验使能*/
|(0 << 21)//等待启用*/
|(0 < 20)/*换向*/
|(0 < 17)/*时钟极性*/
|(0 < 16)/*时钟相位*/
//|(79 << 8)/*波特率预分频、1M Hz */
|(7 << 8)/*波特率预分频、10M Hz */
|16;/*数据字长度*/
/**-设置中断级别*/
SpiInfo->LVL =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */
/**-清除所有挂起的中断*/
SpiInfo->FLG = 0xFFFFFFU;
/**-启用中断*/
SpiInfo->INT0 =(0 << 9)/* TXINT */
|(0 < 8)/* RXINT */
|(0 << 6)/* OVRNINT */
|(0 << 4)/* BITERR */
|(0 < 3)/* DESYNC */
|(0 << 2)/* PARERR */
|(0 << 1)/*超时*/
|(0);/* DLENERR */
/**@b 初始化@b SPI3 @b 端口*/
/**- SPI3端口输出值*/
SpiInfo->PC3 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/**- SPI3端口方向*/
SpiInfo->PC1 = 1/* SCS[0]*/
|(0 < 8)/* ENA */
|(0 < 9)/* CLK *//lugh
|(0 < 10)/* SIMO */
|(1 << 11);/* SOMI */
/**- SPI3端口开漏使能*/
SpiInfo->PC6 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/**- SPI3端口上拉/下拉选择*/
SpiInfo->PC8 = 1/* SCS[0]*/
|(1 << 8)/* ENA */
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */
/**- SPI3端口上拉/下拉使能*/
SpiInfo->PC7 = 0 /* SCS[0]*/
|(0 < 8)/* ENA */
|(0 << 9)/* CLK */
|(0 < 10)/* SIMO */
|(0 < 11);/* SOMI */
/* SPI2将所有引脚设置为功能*/
SpiInfo->PC0 = 0 /* SCS[0]*//lugh
|(0 < 8)/* ENA *//lugh
|(1 << 9)/* CLK */
|(1 << 10)/* SIMO */
|(1 << 11);/* SOMI */
/**-初始化 TX 和 RX 数据缓冲区状态*/
G_spiPacket_t[0].TX_DATA_STATUS = SPI_READY;
G_spiPacket_t[0].Rx_DATA_STATUS = SPI_READY;
/*用于 EM 配置的 EmbDataRegCfg。 *
EMDataRegCfg.CSNR = 0;
EMDataRegCfg.CS_HOLD = 0;
EMDataRegCfg.DFSEL = SPI_FMT_0;
EMDataRegCfg.WDEL = 0;
/**-最后启动 SPI3 */
SpiInfo->GCR1 |=(uint32)((uint32) 1U <<24U);/* SPI3启用*/
}
UINT32 SPI_TransmitAndReceiveData (spiBASE-t * SPI、UINT32块大小、
uint16 * srcbuff、uint16 * destbuff)
{
静态 uint16 Tx_Data;
uint16 RecvCnt=0;/*接收等待时间计数。 *
静态 uint16缓冲头标志= 0;/*接收头数据结束标志。 *
while (blocksize!= 0U)
{
if ((SPI->FLG & 0x000000FFU)!= 0U)/*出错。*/
{
中断;
}
TX_Data =* srcbuff;
SPI->DAT1 =(SPI->DAT1 & 0xFFFF0000U)|((UINT32) Tx_Data);
srcbuff +;
while ((SPI->FLG & 0x00000100U)!= 0x00000100U)
{
RecvCnt++;
if (RecvCnt >= 500)
{
中断;
}
}/*等待*/
*缓冲区=(uint16)(SPI->BUF & 0xFFFFFFU);
if ((blocksize =20)&&(* destbuff ==0xAAAA))
{
BufferHeadFlag = 1;
}
if (缓冲头标志= 1)
{
减持器++;
}
块大小----
}
BufferHeadFlag = 0;
返回(SPI->FLG & 0xFFU);
}