嵌入式开发者社区

标题: C6748 SPI0和SPI1通信 [打印本页]

作者: xtong533    时间: 2016-8-8 15:14
标题: C6748 SPI0和SPI1通信
我在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);
}
}


作者: xtong533    时间: 2016-8-8 15:19
我在STM32开发板上也做过类似的实验,来验证SPI通信。不知道什么原因,不知道什么原因,从机发出的一直是0. 会不会是我的从机程序有问题,大家要是有更好的从机程序,可以贴出来共享下。用开发板自己的SPI互相通信,验证起来很方便。
大家也可以拿我的程序试一下
作者: xtong533    时间: 2016-8-8 15:42
?? 难道没人有兴趣在开发板上跑一下吗

作者: human    时间: 2016-8-8 19:14
不互通,用其他SPI模块测试,看看又是什么情况
作者: xtong533    时间: 2016-8-8 19:59
human 发表于 2016-8-8 19:14
不互通,用其他SPI模块测试,看看又是什么情况

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

作者: xtong533    时间: 2016-8-8 20:22
求SPI从机程序
作者: xtong533    时间: 2016-8-9 10:11
我来顶一下
作者: 希望缄默    时间: 2016-8-10 09:00
xtong533 发表于 2016-8-9 10:11
我来顶一下

[attach]1045[/attach]
这是之前测试的两块 C6748 SPI 通信程序

作者: xtong533    时间: 2016-8-10 09:05
希望缄默 发表于 2016-8-10 09:00
这是之前测试的两块 C6748 SPI 通信程序

非常感谢,非常感谢
作者: xtong533    时间: 2016-8-10 14:55
本帖最后由 xtong533 于 2016-8-10 15:45 编辑
希望缄默 发表于 2016-8-10 09:00
这是之前测试的两块 C6748 SPI 通信程序

我的程序还是有问题,今天对自己的程序作了少许改动,从新测试了程序。
可以通信了,先前从机发不出数据的问题基本解决了。
但是,主机或是从机如果有数据的最高位是1,比如0x80,0xff,0xad,程序就会卡在接收判断的那个while处。
(      while( HWREG(SOC_SPI_0_REGS + SPI_SPIBUF) & (0x80000000));           )


我是用杜邦线将开发板上的SPI连到一起的,是不是杜邦线产生的影响。或者是SPI时序设置的影响。
作者: xtong533    时间: 2016-8-11 16:06
human 发表于 2016-8-8 19:14
不互通,用其他SPI模块测试,看看又是什么情况

C6748DSP的SPI1作为从机,和一个STM32的SPI通信,采用三线模式。
DSP 的SPi的SCk,MOSI正常,接收到了数据,数据也正确。但是MISO引脚上却
没有数据,示波器也测不到波形。非常不理解,感觉理论上不可能,正常情况下发送和接收是同时进行的,既然接收到了数据也应该发送出数据的。
请问human 这种情况会是什么原因导致的。实在想不通哪里搞错了
作者: 希望缄默    时间: 2016-8-11 20:02
xtong533 发表于 2016-8-10 14:55
我的程序还是有问题,今天对自己的程序作了少许改动,从新测试了程序。
可以通信了,先前从机发不出数据的 ...

貌似没有遇到过这个问题.....[attach]1054[/attach]
这条语句是查询接收有效位 为1代表没有 数据没有接收到.......... 可能是连接问题 建议测下 SPI 时序 使用逻辑分析仪 示波器什么的

作者: wang17077869    时间: 2017-9-10 14:11
楼主好,能不能把DSP的SPI从接收程序分享一下,不胜感激
作者: 泽1997126    时间: 2022-2-22 22:24
用一个SPI 在开发板上用杜邦线将MISO 和MOSI短接来查看是否能发送接收数据,这样验证是否可行?
作者: 泽1997126    时间: 2022-2-28 21:57
希望缄默 发表于 2016-8-10 09:00
这是之前测试的两块 C6748 SPI 通信程序

大佬 我用你这个例程自发自收 将CHAR_LENGTH改为16为什么发送的数据仍然最大只能到255呢 在其他的程序里修改CHAR_LENGTH就可以直接修改传送的数据大小
作者: 泽1997126    时间: 2022-3-11 10:15
您好 请问您的问题解决了吗 我现在和您一样的问题 能分享下您的从机数据吗




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4