C6748 SPI0和SPI1通信 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12850|回复: 15

C6748 SPI0和SPI1通信

[复制链接]

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
发表于 2016-8-8 15:14:58 | 显示全部楼层 |阅读模式
我在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);
}
}

回复

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-8 15:19:06 | 显示全部楼层
我在STM32开发板上也做过类似的实验,来验证SPI通信。不知道什么原因,不知道什么原因,从机发出的一直是0. 会不会是我的从机程序有问题,大家要是有更好的从机程序,可以贴出来共享下。用开发板自己的SPI互相通信,验证起来很方便。
大家也可以拿我的程序试一下
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-8 15:42:22 | 显示全部楼层
?? 难道没人有兴趣在开发板上跑一下吗
回复 支持 反对

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
发表于 2016-8-8 19:14:18 | 显示全部楼层
不互通,用其他SPI模块测试,看看又是什么情况
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-8 19:59:58 | 显示全部楼层
human 发表于 2016-8-8 19:14
不互通,用其他SPI模块测试,看看又是什么情况

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

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-8 20:22:35 | 显示全部楼层
求SPI从机程序
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-9 10:11:07 | 显示全部楼层
我来顶一下

点评

这是之前测试的两块 C6748 SPI 通信程序  详情 回复 发表于 2016-8-10 09:00
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
发表于 2016-8-10 09:00:39 | 显示全部楼层


这是之前测试的两块 C6748 SPI 通信程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-10 09:05:56 | 显示全部楼层
希望缄默 发表于 2016-8-10 09:00
这是之前测试的两块 C6748 SPI 通信程序

非常感谢,非常感谢
回复 支持 反对

使用道具 举报

7

主题

45

帖子

169

积分

注册会员

Rank: 2

积分
169
 楼主| 发表于 2016-8-10 14:55:23 | 显示全部楼层
本帖最后由 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时序设置的影响。

点评

貌似没有遇到过这个问题.....[attachimg]1054[/attachimg] 这条语句是查询接收有效位 为1代表没有 数据接收到.......... 可能是连接问题 建议测下 SPI 时序 使用逻辑分析仪 示波器什么的  详情 回复 发表于 2016-8-11 20:02
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-29 05:34 , Processed in 0.050503 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表