创龙科技
直播中

王颖

7年用户 170经验值
私信 关注

C6748 SPI0和SPI1通信,SPI主机收不到数据

[tr]我在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
/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
#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 优先
    SPIShiftM***First(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 优先
    SPIShiftM***First(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 , %dn ",SPI0_Buffer_Rx
[/tr]

回帖(13)

陈蕾

2019-7-31 12:03:24
我在STM32开发板上也做过类似的实验,来验证SPI通信。不知道什么原因,不知道什么原因,从机发出的一直是0. 会不会是我的从机程序有问题,大家要是有更好的从机程序,可以贴出来共享下。用开发板自己的SPI互相通信,验证起来很方便。
大家也可以拿我的程序试一下
举报

白珊

2019-7-31 12:08:40
?? 难道没人有兴趣在开发板上跑一下吗

举报

李德鹏

2019-7-31 12:27:06
不互通,用其他SPI模块测试,看看又是什么情况
举报

李林臻

2019-7-31 12:41:33


C6748的SPI1作为从机和STM32的SPI通信,依然是这种情况,从机发的数据一直为0,所以我希望哪位高手能够贴出一个标准的SPI从机三线模式的例程出来,让大家学习一下

举报

更多回帖

发帖
×
20
完善资料,
赚取积分