This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:SSI 主从器件连接。

Guru**** 2478765 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/689437/tm4c123gh6pm-ssi-master-slave-connection

器件型号:TM4C123GH6PM

我正在尝试在主模式下配置 SS0、在从模式下配置 SS3。

然后 SSI3模块接收数据、如果数据与发送的数据相匹配、则绿色 LED 将亮起。

我在调试模式下运行代码、通过检查发现代码卡在一个循环中、等待 SSI3从机模块接收数据。

它有时会运行、但未接收到文本"Hey"、我正在接收垃圾值。

硬件连接:

SSI0时钟连接到 SSI3时钟

SSI0Fss 连接到 SSI3Fss

SSI0Tx 连接到 SSI3Rx

SSI0Rx 连接到 SSI3Tx

以下是供您参考的代码。

#include
#include
#include
#include
#include
#include
#include

#include
#include
#include

#include
#include

#define PORTD_LOCK (*(无符号长整型*)(GPIO_PORTD_BASE|0x0520)
#define PORTD_CR   (*(无符号长整型   *)(GPIO_PORTD_BASE|0x0524)
#define PORta_lock (*(unsigned long *)(GPIO_PORta_base|0x0520))
#define PORta_CR   (*(unsigned long   *)(GPIO_PORta_base|0x0524))

void SSI_init (void);
void gpioInit(void);
int main (空)
{  char * pcChars ="Hey";
     char * rcvd;
   uint32_t *c、*垃圾;
   uint32_t、s;
   int i;
       int32_t i32Idx;
   bool isEq=true;
   C=t;
   垃圾邮件(&S);


    gpioInit();
   //SSI0模块已配置为主机模式
   //SSI3模块已配置为从机模式
   SSI_init();

   //
//发送一些数据。
//
i32Idx = 0;
while (pcChars[i32Idx])

   SSIDataPut (SSI0_BASE、pcChars[i32Idx]);
   SSIDataGet (SSI0_BASE、SAWRAID);

   SSIDataPut (SSI3_base、0xFF);
   SSIDataGet (SSI3_base、c);
   Rcvd[i32Idx]=t;
i32Idx++;


for (i=0;<sizeof(pcChars);i++))

   if (pcChars[i]!=rcvd [i])
   {isEq=false;
   }

if (isEq=true)

GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、0x08);

返回0;

空 SSI_init (空)

   //使用一个4MHz 晶振将器件配置为从 PLL 以80MHz 的频率运行
   //作为输入。
   //
   SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);
//
//启用 SSI0外设
//
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//等待 SSI0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0))

SSIDisable (SSI0_BASE);

//解锁端口后再用作 SSI
PORta_lock=0x4C4F434B;
PORTA_CR=0x3C;
//为 SSI 模块设置引脚复用
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinConfigure (GPIO_PA5_SSI0TX);

//setup 引脚类型
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);

//配置 SSI0。
SSIClockSourceSet (SSI0_BASE、SSI_CLOCK_SYSTEM);
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、3300000、8);
//
//启用 SSI 模块。
//
SSIEnable (SSI0_BASE);

//
//启用 SSI3外设
//
SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
//
//等待 SSI 模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI3))


//
//配置 SSI。
//
SSIDisable (SSI3_base);

//解锁端口后再用作 SSI

PORTD_LOCK = 0x4C4F434B;
PORTD_CR=0x0F;

//为 SSI 模块设置引脚复用
GPIOPinConfigure (GPIO_PD0_SSI3CLK);
GPIOPinConfigure (GPIO_PD1_SSI3FSS);
GPIOPinConfigure (GPIO_PD2_SSI3RX);
GPIOPinConfigure (GPIO_PD3_SSI3TX);

//setup 引脚类型
GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

//配置 SSI3从设备
SSIClockSourceSet (SSI3_base、SSI_CLOCK_SYSTEM);
SSIConfigSetExpClk (SSI3_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、3300000、8);
//
//启用 SSI 模块。
//
SSIEnable (SSI3_base);

void gpioInit()

   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
       while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF))
       {
       }

GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_3);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Vikram、

    我正在尝试通过将数据从 SSI3发送到 SSI0来准确了解您想要实现的目标。 除了 SSI 环回外、您还想实现什么? 有一种方法可以在单个 SSI 端口上执行 SSI 环回、如果这符合您的需求、我可以提供一个示例供您使用。

    查看您为同一 SSI 模块执行的代码、使它们彼此相邻、因此看起来更像是回送操作、而不是任何操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我尝试检查 MCU 上的 SPI 模块。 我的主要想法是将 Nokia 510 LCD 连接到它。 我现在成功地进行了交互。