主题中讨论的其他器件:C2000WARE、
CCS -版本10.1.1
C2000Ware -版本3.03.00
问题说明:
在 TMS320F28027 (主器件)和 ST25R3916 (从器件- NFC 读取器 IC)之间建立 SPI 接口。
从器件可支持高达10MHz 的时钟、并具有512字节 FIFO 缓冲器。
对于我们的方案、我们至少需要同时通过 SPI 发送和接收数据
在10MHz SPICLK 上运行时、数据一次为200字节。
SYSCLK - 60MHz
SPI 配置:
void SPI_cfg (void)
{
EALLOW;
clk_handle->LOSPCP = 0;//Setting the peripheral clk freq to sys clk freq (60MHz)
EDIS;
CLK_enableSpiaClock (clk_handle);
SPI_setCharLength (SPI_Handle、SPI_CharLength _8_Bits);
SPI_setMode (SPI_Handle、SPI_Mode_Master);
SPI_enableTx (SPI_Handle);
SPI_Handle->SPIBRR = 59;
SPI_ENABLE (SPI_Handle);
//设置断点以使断点不会干扰 xmission
SPI_setPriority (SPI_Handle、SPI_Priority_freeRun);
SPI_enableChannels (SPI_Handle);
SPI_enableFifoEnh (SPI_Handle);
SPI_resetTxFifo (SPI_Handle);
SPI_clearTxFifoInt (SPI_Handle);
SPI_resetRxFifo (SPI_Handle);
SPI_clearRxFifoInt (SPI_Handle);
SPI_enableRxFifo (SPI_Handle);
SPI_enableTxFifo (SPI_Handle);
}
情况1:发送并等待 Rx 状态标志设置为读取、然后在读取后写入
void SPI_Transmit _Receive (uint16_t * tx_buff、uint16_t * rx_buff、uint16_t len)
{
volatile uint16_t remain_len = 0;
while (remain_len < len)
{
SPI_WRITE (SPI_Handle、((uint16_t) TX_buff [剩余_len])<< 8);
while (!(SPI_Handle->SPIFFRx & 0x1F00));//等待 Rx 状态标志被置位
RX_buff[Remain_len]=(uint8_t)(SPI_Read (SPI_Handle)& 0x00FF);
剩余_len++;
}
}
情况2:如果 Rx 状态标志被置位、则为只读
通过使用这种方法、我们能够同时发送和接收@1MHz SPICLK、而且这也只能达到60字节。
如果发送和接收缓冲区大于60、则少数字节不会更新到 Rx 缓冲区中、而是会更新
可以在逻辑分析仪中看到它。
void SPI_Transmit _Receive (uint16_t * tx_buff、uint16_t * rx_buff、uint16_t len)
{
volatile int TX_len = 0、RX_len = 0;
while (tx_len < len || rx_len < len)
{
if (tx_len < len)
{
SPI_WRITE (SPI_Handle、((uint16_t) TX_buff [TX_len])<< 8);
TX_Len++;
}
if (rx_len < len)
{
if (SPI_Handle->SPIFFRX & 0x1F00)
{
RX_buff[RX_len]=(uint8_t)(SPI_Read (SPI_Handle)& 0x00FF);
RX_Len++;
}
}
}
}



