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**** 2462070 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/655803/tm4c123gh6pm-ssi-communication-on-1-board

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

大家好、TI 社区、  

我正在尝试实施 SPI 通信的基础知识。 我有1个 tm4c123 Launchpad。

在考虑一个主器件和另一个从器件的情况下,我能否在同一电路板上将数据从 SSI0发送到 SSI1?

如果是,我是否需要连接从器件选择信号 SS?  

此致、  

斯里特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    人们相信、"供应商示例"-以及更可能的"此处的海报尝试"(通过使用论坛搜索框找到)将揭示并详细介绍"旋转以实现"等实施。

    至于从器件选择-必须驱动/控制该引脚的是您的"主 SPI"-是这样吗? 而主器件"包括"一个 SPI"从器件、CHIP_SELECT"引脚-这证明(通常)过于不灵活-而是采用主器件 GPIO。 (正是这个"主 GPIO "连接到从器件的 SS 引脚(是另一个 SPI 端口(具有同一个 MCU)或一个(更常见的)外部从器件)。

    为了澄清-"是-您的 MCU 的主 SPI (选择用作从 CS 的 GPIO)与 MCU 的从 SPI (SS 引脚)之间存在连接"
    虽然公司和我都没有实际实现这种"旋转至 SPIM -单个 MCU 连接"、但"更广泛(更常见)的实现要求主器件侧 SPI 向(正常)外部芯片从器件生成适当的"CS"信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 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)。。。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1.
    感谢您的长时间重播。
    由于我是初学者、想要了解通信协议的基础知识、因此我始终倾向于在直接访问寄存器模式下编写第一个代码、以确保深入了解并构建基础知识。 第二步是使用指南及其有趣示例的 TivaWare、我对我在 MCU 编程中学习的每个主题都做了同样的操作。
    无论如何…… 再次感谢您的帮助

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

    谢谢、我的朋友。

    请允许我(再次)质疑您的观点,即(someway)“Starting w/DRM”... "确保有充分的理解?"

    如果会产生这样的"强烈理解"-您的代码是否会"完全达到预期?"    唉——它不 (事实上——也不(甚至)“接近”)——而时钟节拍—而强烈的理解证明,“没有什么可看的!”     (并非所有"证据中的事实"都指向这一不可避免的方向?)

    我是否可以建议使用"混合方法"(由我们的实习生和新员工聘用)、其中包括 API 的"联合使用"(根据项目要求选择最合适的 API 功能) (然后)认真访问 MCU 手册的"寄存器演示"-在 API 的"更广泛的刷子!"中添加"光"

    种"混合方法"有望"快速、轻松、增强"您的学习、从而"掌握!"     比"仅 DRM "更快、更高效!    (您访问此处-由"仅 DRM 失败"方法提供-明确地表明-不是吗?)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1、
    "#like"你的出色建议。 您的混合方法就是我所学的方法、它既能实现快速开发、又能实现深入理解。 很棒的建议!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、

    我已经告诉我心:“要继续!”   非常感谢您的友好"#like -以及您与"speed、Eased & Enhanced"达成的协议了解种"混合"方法令人放心。   (API 选择性使用-然后正确查看 、"正在使用的寄存器"。)

    "仅限 DRM "的支持者、"闭上  眼睛"对这种"混合方法"提供的主要好处!     (即混合从每个编码方法中提取"最佳"特性、优势和见解。)   API 是"世界级的!"   它:“深度、广度和能力,明显地“速度、方便代码开发,证明了“不可抗拒”——拒绝了它的使用边界,“愚蠢!”  

    这种"混合"选举(API 的适当组合、然后进行寄存器审查) 证明(近乎)是理想的、即使  "闭眼"的人"错过"(可能是故意的)也是如此!