主题中讨论的其他器件:TM4C123
大家好、TI 社区、
我正在尝试实施 SPI 通信的基础知识。 我有1个 tm4c123 Launchpad。
在考虑一个主器件和另一个从器件的情况下,我能否在同一电路板上将数据从 SSI0发送到 SSI1?
如果是,我是否需要连接从器件选择信号 SS?
此致、
斯里特
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.
大家好、TI 社区、
我正在尝试实施 SPI 通信的基础知识。 我有1个 tm4c123 Launchpad。
在考虑一个主器件和另一个从器件的情况下,我能否在同一电路板上将数据从 SSI0发送到 SSI1?
如果是,我是否需要连接从器件选择信号 SS?
此致、
斯里特
您好 CB1、
感谢您的重播。 我使用 SSI0作为从 器件、使用 SSI1作为主器件、使用 PD6作为 SS 信号。
我已按以下方式连接接线:
从 PD6到 PA3的 SS 信号(从器件的 SS 引脚)
PD0至 PA2 (主器件和从器件上的时钟引脚)
PD3至 PA4 (主器件的 TX 至从器件的 RX)
PD2至 PA5 (主器件的 RX 至从器件的 TX)
但是、当我写入尝试发送字节的主器件的数据寄存器时、其值不会改变!
不会进行传输
请帮帮我。 要成功进行数据传输、我应该怎么做?
这是初始化代码和主代码
void SSI0_Init (void){
// GPIO Porta 中 TX、RX、SS、CLK 的设置
SYSCTL_RCGCSSI_R |= 0x01; SSI0模块上的//时钟
SYSCTL_RCGCGPIO_R |= 0x01; // Porta 上的时钟
GPIO_Porta_AFSEL_R |= 0x3c;//可选。 用于 Porta 2、3、4、5的函数
GPIO_Porta_PCTL_R |= 0x00222200;
GPIO_Porta_den_R |= 0x3c; //数字使能
SSI0模块的//设置
SSI0_CR1_R = 0; //配置期间禁用
SSI0_CC_R = 0; //系统时钟
SSI0_CPSR_R = 2; //预分频器 div x 2.
SSI0_CR0_R |= 0x07; // 8MHZ、SPI 模式、8位帧
SSI0_CR1_R |= 0x04; //设置为从设备
SSI0_CR1_R |= 0x02; //启用
}
void SSI1_Init(void){
// GPIO Porta 中 TX、RX、SS、CLK 的设置
SYSCTL_RCGCSSI_R |= 0x02; SSI1模块上的//时钟
SYSCTL_RCGCGPIO_R |= 0x08; PORTD 上的//时钟
GPIO_PORTD_AFSEL_R |= 0x0F;//可选 PORTD 0、1、2、3的函数
GPIO_PORTD_PCTL_R |= 0x02;
GPIO_PORTD_DEN_R |= 0x0F; //数字使能
//将 PD6设置为 SS 信号
GPIO_PORTD_DIR_R |= 0x40; // PD6输出
GPIO_PORTD_DEN_R |= 0x40; //数字使能 PD6
GPIO_PORTD_DATA_R |= 0x40; //保持 SS 空闲高电平
SSI1模块的//设置
SSI1_CR1_R = 0; //配置期间禁用
SSI1_CC_R = 0; //系统时钟
SSI1_CPSR_R = 2; //预分频器 div x 2.
SSI1_CR0_R |= 0x07; // 8MHZ、SPI 模式、8位帧
SSI1_CR1_R = 0x00; //设置为主设备
SSI1_CR1_R |= 0x02; //启用
}
int main(){
SSI0_Init();
SSI1_Init();
while (1){
//将 ss 设置为低电平
GPIO_PORTD_DATA_R &=~0x40; // ss 低位
while ((SSI1_SR_R & 0x02)=0){} //等待 FIFO 未满
SSI1_DR_R = 0xff; //发送 char a
while (SSI1_SR_R & 0x10){} //等待 TX 完成
GPIO_PORTD_DATA_R |= 0x40; // ss 高电平
uint32_t 数据;
while ((SSI0_SR_R & 0x04)=0){} //等待 FIFO 标志不为空
数据= SSI0_DR_R; //数据读取
int i = data;
}
}
此致、
斯里特
我的朋友,虽然我自己/他人,“感受你的痛苦”,但这种痛苦不是多少是自己造成的?
由于原因不明、您选择了一种代码样式(直接寄存器操作、"DRM")、该样式长期以来一直被称为(两者)过时和低效。 我们是否可以询问这种"DRM"风格是如何选择的?
您来到这里、"寻求加深您对 SPI 操作的理解。" 这是一个适当的目标。 但是-您的"攻击方法"(DRM 的独占使用)证明无效-正如您到达此处(减去任何 SPI 成功)所证明的那样。 而这种"海报的失败成功"-当使用"DRM"时-是"传奇!" 这里的供应商尤其不鼓励 DRM 的使用-他们也注意到了"不可接受的故障率"- DRM 带来的可预测结果!
您有一个明确的选择- 这家供应商广泛的、"已尝试、正确、已测试"的 API。 相反、任何开发人员使用 DRM 都会产生"未经尝试(通常)的不真实和未经测试"的结果。 这怎么会很好?
该 API 提供了全面的代码示例(SPI 涵盖得很好)、这完全被"MCU 外设"完美地组合在一起-加速和简化您的"真正学习!" (不是由 DRM 过度承诺/推广的"虚拟化学习"、因此很少交付!)
您可以在以下位置找到基于 SPI 的模型代码示例:TivaWare\examples\peripherals\SPI。 在"外设驱动程序库用户指南"中对 API 进行了深入、清晰的解释/详细的解释- Fir/I 认为这是必需的阅读... 甚至是它的掌握程度。
这里很少有人会花费"过多的时间和精力"-审核您的 DRM 代码所需的时间和精力。 这种"不"是"意思"、这就意味着您的家门口就有一种非常出色的方法(API)。。。
谢谢、我的朋友。
请允许我(再次)质疑您的观点,即(someway)“Starting w/DRM”... "确保有充分的理解?"
如果会产生这样的"强烈理解"-您的代码是否会"完全达到预期?" 唉——它不 (事实上——也不(甚至)“接近”)——而时钟节拍——而强烈的理解证明,“没有什么可看的!” (并非所有"证据中的事实"都指向这一不可避免的方向?)
我是否可以建议使用"混合方法"(由我们的实习生和新员工聘用)、其中包括 API 的"联合使用"(根据项目要求选择最合适的 API 功能) (然后)认真访问 MCU 手册的"寄存器演示"-在 API 的"更广泛的刷子!"中添加"光"
这种"混合方法"有望"快速、轻松、增强"您的学习、从而"掌握!" 比"仅 DRM "更快、更高效! (您访问此处-由"仅 DRM 失败"方法提供-明确地表明-不是吗?)
Bob、
我已经告诉我心:“要继续!” 非常感谢您的友好"#like -以及您与"speed、Eased & Enhanced"达成的协议了解这种"混合"方法令人放心。 (API 选择性使用-然后正确查看 、"正在使用的寄存器"。)
"仅限 DRM "的支持者、"闭上 眼睛"对这种"混合方法"提供的主要好处! (即混合从每个编码方法中提取"最佳"特性、优势和见解。) API 是"世界级的!" 它:“深度、广度和能力,明显地“速度、方便”代码开发,证明了“不可抗拒”——拒绝了它的使用边界,“愚蠢!”
这种"混合"选举(API 的适当组合、然后进行寄存器审查) 证明(近乎)是理想的、即使 "闭眼"的人"错过"(可能是故意的)也是如此!