您好!
我使用 Keil uvision4进行编程。 我已经独立验证了 SSI1作为 SPI 主设备可以正常工作。 接下来、我将尝试将 TM4C123G 的 SSI1配置为 SPI 从器件。 我的目标是读取传入的 SPI 命令值、然后根据寄存的命令值传输数据。 硬件连接如图所示。 第一个 TM4C123G 的 SSI3是 SPI 主设备、正在发送命令值0XDC。 主器件工作正常、如所示、连接的示波器图中所示、验证 SSI3作为 SPI 主器件的功能。
接下来、我在第二个 TM4C123G 上将 SSI1配置为从设备、以便将传入的命令0xDC 寄存在变量中。 我遇到了一个问题、那就是配置为从设备的 SSI1无法注册传入的 SPI 事务。 在初始化 GPIO 引脚(端口 F)或配置 SPI1从器件时可能存在问题、但我无法确定问题、因此请求帮助查看是否可以确定问题。 我已经尝试了几种替代方法来将 SSI1端口配置为从站、例如强制将 SSI1FSS、SSI1CLK 和 SSI1Rx 用作数字输入、并将 SSI1Tx 强制为数字输出、但结果无效。 代码说明如下。 如需更多信息、请在方便时告知我。
//主 C 文件
#包含
#包含
#包含
#包含
#包含
#包含
#include "../tm4c123gh6p.h"
#include "SSI1.h"//包含 SSI1_Init ()和 receive8_SSI1()函数
#include "PLL.h"
#include "Timers.h"
#include "UART1.h"
#include "utils/uartstdio.h"
#include "driverlib/fpu.h"
#include "driverlib/uart.h"
void EnableInterrupts (void);//启用中断
uint16_t 命令;
uint32_t ssi1_rxdata;
无符号长整型标志;//邮箱标志
int main (void){
易失性无符号长延迟;
PLL_Init ();
UART1_Init ();
SSI1_Init ();//将 SPI1初始化为从机。
Timer2A_Init (160000);
//为中断处理程序启用怠惰堆栈。 这允许使用浮点
//在中断处理程序中使用指令,但代价是
//额外的堆栈使用。
FPUEnable();
FPULazyStackingEnable();
EnableInterrupts ();
while (1){
command=receive16_SSI1 ();//在变量中注册传入命令0x00dc
标志= 0;
// ms_delay (125);
}
}
void SSI1_Init (void){
易失性无符号长延迟;
// SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI1;//激活 SSI1
SYSCTL_RCGCSSI_R |= 0x02;//激活 SSI1
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF;//激活端口 F
延迟= SYSCTL_RCGC2_R;//允许有时间完成激活
GPIO_PORTF_LOCK_R = 0x4C4F434B;//解锁 GPIO 端口 F。
GPIO_PORTF_CR_R |= 0x0F;//允许更改 PF3-0
GPIO_PORTF_AFSEL_R |= 0x0F;//在 PF2、1、0上启用 ALT 函数、使用0x7作为从属方
GPIO_PORTF_PUR_R |= 0x0C;//启用 PF3上拉
GPIO_PORTF_DEN_R |= 0x0F;//在 PF0-3上启用数字 I/O
//将 PF3、2、0配置为 SSI
GPIO_PORTF_PCTL_R =(GPIO_PORTF_PCTL_R&0xFFFF0000)+0x00002222;//SSI1用作从器件
GPIO_PORTF_AMSL_R &=~0x0F;//禁用 PF3、2、1、0上的模拟功能
// GPIO_PORTF_DIR_R |= 0x08;//将 PF3输出(! CS1信号)
// GPIO_PORTF_DIR_R &&~0x08;//使 PF3输入(! CS1信号)
SSI1_CR1_R &&~μ A SSI_CR1_SSE;//禁用 SSI
// SSI1_CR1_R &=~SSI_CR1_MS;//主模式
SSI1_CR1_R |= SSI_CR1_MS;//从模式
//配置系统时钟/PLL 波特时钟源
SSI1_CC_R =(SSI1_CC_R+~SSI_CC_CS_M)+SSI_CC_CS_SYSPLL;
//用于10 MHz SSIClk 的时钟分频器(80 MHz PLL/8)
// SYSCLK/(CPSDVSR*(1+SCR))
// 80/(8*(1+0))= 10 MHz (比4 MHz 更快)
SSI1_CPSR_R =(SSI1_CPSR_R+~SSI_CPSR_CPSDVSR_M)+8;//必须是偶数、10MHz SPI
SSI1_CR0_R &=~(SSI_CR0_SCR_M);// SCR = 0 (10Mbps 数据速率)
SSI1_CR0_R |=(SSI_CR0_SPH |// SPH = 1
SSI_CR0_SPO);// SPO = 1
// FRF =飞思卡尔格式
SSI1_CR0_R =(SSI1_CR0_R+~SSI_CR0_FRF_M)+SSI_CR0_FRF_MOTO;
// DSS = 16位数据
SSI1_CR0_R =(SSI1_CR0_R+~SSI_CR0_DSS_M)+SSI_CR0_DSS_16;
SSI1_CR1_R |= SSI_CR1_SSE;//启用 SSI
}
//***** 接收16_SSI1_SSI1*****
//接收16位代码
uint8_t receive16_SSI1 (void){
while (((SSI1_SR_R&SSI_SR_RNE)=0){};//等待响应
返回 SSI1_DR_R;//确认响应
}

