|
我在TL138/6748/1808-EasyEVM-A3 开发板上,SPI0和SPI1互相通信,采用的三线模式。
SPI主机收不到数据。SPI0和SPI1互换主从也不行。下面是我的程序
#include "soc_C6748.h"
#include "hw_psc_C6748.h"
#include "spi.h"
#include "psc.h"
#include "hw_types.h"
#include "hw_syscfg0_C6748.h"
#include <stdio.h>
/****************************************************************************/
/* */
/* 宏定义 */
/* */
/****************************************************************************/
#define SIMO_SOMI_CLK 0x00000E00
#define CHAR_LENGTH 0x08
#define BufferSize 8
char SPI0_Buffer_Tx[BufferSize] = {0x01,0x02,0x04,0x08,0x08,0x08,0x08,0x08};
char SPI1_Buffer_Tx[BufferSize] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
char SPI0_Buffer_Rx[BufferSize], SPI1_Buffer_Rx[BufferSize];
/****************************************************************************/
/* */
/* 函数声明 */
/* */
/****************************************************************************/
void PSCInit(void);
void GPIOBankPinMuxSet(void);
void SPI1Init(void);
void SPI0Init(void);
void SPITest(void);
/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
int main(void)
{
PSCInit();
// 管脚复用配置
GPIOBankPinMuxSet();
// SPI1 初始化
SPI1Init();
// SPI0 初始化
SPI0Init();
// 测试
SPITest();
while(1);
}
/****************************************************************************/
/* */
/* PSC 初始化 */
/* */
/****************************************************************************/
void PSCInit(void)
{
// 使能 SPI 模块
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_SPI1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}
/****************************************************************************/
/* */
/* SPI初始化 */
/* */
/****************************************************************************/
void SPI1Init(void)
{
unsigned int pin_s = SIMO_SOMI_CLK;
SPIReset(SOC_SPI_1_REGS);
SPIOutOfReset(SOC_SPI_1_REGS);
// 配置 SPI为从模式
SPIModeConfigure(SOC_SPI_1_REGS, SPI_MASTER_MODE);
// 配置SPI 时钟 SPI bus speed is 20000000Hz
SPIClkConfigure(SOC_SPI_1_REGS, 150000000, 20000000, SPI_DATA_FORMAT0);
// SPI管脚选择 , 3线模式
SPIPinControl(SOC_SPI_1_REGS, 0, 0, &pin_s);
// 配置 SPI 发送时 MSB 优先
SPIShiftMsbFirst(SOC_SPI_1_REGS, SPI_DATA_FORMAT0);
// 设置字符长度
SPICharLengthSet(SOC_SPI_1_REGS, CHAR_LENGTH, SPI_DATA_FORMAT0);
// 使能 SPI
SPIEnable(SOC_SPI_1_REGS);
}
void SPI0Init(void)
{
unsigned int pin_s = SIMO_SOMI_CLK;
SPIReset(SOC_SPI_0_REGS);
SPIOutOfReset(SOC_SPI_0_REGS);
// 配置 SPI为主模式
SPIModeConfigure(SOC_SPI_0_REGS, SPI_SLAVE_MODE);
// 配置SPI 时钟 SPI bus speed is 20000000Hz
SPIClkConfigure(SOC_SPI_0_REGS, 150000000, 20000000, SPI_DATA_FORMAT0);
// SPI管脚选择 , 3线模式
SPIPinControl(SOC_SPI_0_REGS, 0, 0, &pin_s);
// 配置 SPI 发送时 MSB 优先
SPIShiftMsbFirst(SOC_SPI_0_REGS, SPI_DATA_FORMAT0);
// 设置字符长度
SPICharLengthSet(SOC_SPI_0_REGS, CHAR_LENGTH, SPI_DATA_FORMAT0);
// 使能 SPI
SPIEnable(SOC_SPI_0_REGS);
}
/****************************************************************************/
/* */
/* 管脚复用配置 */
/* */
/*****************************************************************************/
void GPIOBankPinMuxSet(void)
{
// SPI0 PINMUX enable CLK、SOMI、SIMO
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) |= 0x00001101;
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) &= 0xffff11f1;
// SPI1 PINMUX enable CLK、SOMI、SIMO
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(5)) |= 0x00110100;
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(5)) &= 0xff11f1ff;
}
/****************************************************************************/
/* */
/* SPI 联通测试 */
/* */
/*****************************************************************************/
void SPITest(void)
{
int m;
char Tx_Idx = 0, Rx_Idx = 0;
printf("test start \n");
/* Transfer procedure */
while(Tx_Idx < BufferSize)
{
// printf(" .....\n");
/* Wait for SPI1 Tx buffer empty */
while( HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & (0x20000000));
/* Send SPI0 data */
SPITransmitData1(SOC_SPI_0_REGS,SPI0_Buffer_Tx[Tx_Idx] );
/* Send SPI1 data */
SPITransmitData1(SOC_SPI_1_REGS,SPI1_Buffer_Tx[Tx_Idx] );
/* Wait for SPI0 data reception */
while( HWREG(SOC_SPI_0_REGS + SPI_SPIBUF) & (0x80000000));
/* Read SPI0 received data */
SPI0_Buffer_Rx[Rx_Idx] = SPIDataReceive(SOC_SPI_0_REGS);
/* Wait for SPI1 data reception */
while( HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & (0x80000000));
/* Read SPI1 received data */
SPI1_Buffer_Rx[Rx_Idx] = SPIDataReceive(SOC_SPI_1_REGS);
Tx_Idx++;
Rx_Idx++;
}
printf("compare value \n");
char i;
for( i = 0; i < BufferSize; i++)
{
printf(" %d , %d\n ",SPI0_Buffer_Rx,SPI1_Buffer_Tx);
printf(" %d , %d\n ",SPI1_Buffer_Rx,SPI0_Buffer_Tx);
}
}
|
|