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.

[参考译文] EK-TM4C123GXL:SSI 到串行闪存接口

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/639144/ek-tm4c123gxl-ssi-to-serial-flash-interface

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123

你(们)好

我正在尝试使用 TM4C123 Launchpad 与 SPI 闪存 AT45DQ321进行通信。 我无法获取 ID。 请有人就我的以下代码向我提供反馈。 我在端口 B 上使用 SSI2

谢谢。  

AJ

void InitializeFlash (void)
{
uint32_t dumpByte、*p;

SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI2))
{
}//结束 while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI2))

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))
{
}//结束 while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))

GPIOPinConfigure (GPIO_PB4_SSI2CLK);
//GPIOPinConfigure (GPIO_PB5_SSI2FSS);
GPIOPinConfigure (GPIO_PB6_SSI2RX);
GPIOPinConfigure (GPIO_PB7_SSI2TX);

GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7);

SSIConfigSetExpClk (SSI2_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);

GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);

SSIEnable (SSI2_base);

P =(uint32_t*)&dumpByte;


while (SSIDataGetNonBlocking (SSI2_base、p))
{
}

}//end void InitializeFlash (void)
/******* /

void readid (void)
{
uint32_t x、*p;

P =(uint32_t*)&x;

GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0x00);

SSIDataPut (SSI2_base、0x9F);
while (SSIBusy (SSI2_base))
{
}
SSIDataGet (SSI2_base、p);
FlashBuffer[0]= 0x000000FF & x;

SSIDataPut (SSI2_base、0x00);
while (SSIBusy (SSI2_base))
{
}
SSIDataGet (SSI2_base、p);
FlashBuffer[1]= 0x000000FF & x;

SSIDataPut (SSI2_base、0x00);
while (SSIBusy (SSI2_base))
{
}
SSIDataGet (SSI2_base、p);
FlashBuffer[2]= 0x000000FF & x;

SSIDataPut (SSI2_base、0x00);
while (SSIBusy (SSI2_base))
{
}
SSIDataGet (SSI2_base、p);
FlashBuffer[3]= 0x000000FF & x;

SSIDataPut (SSI2_base、0x00);
while (SSIBusy (SSI2_base))
{
}
SSIDataGet (SSI2_base、p);
FlashBuffer[4]= 0x000000FF & x;

GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);

//结束空 readid (void)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下、我继续为所有字节读取零
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、AJ、

    我可以随意更新您的帖子。 我更改了主题行、并使用了"插入代码、附加文件等..." 按钮 粘贴 C 代码。 更改主题使其他人更容易理解帖子的内容。 使用 按钮来粘贴代码、使其可读性更高。 社区中能够轻松阅读您的帖子的人越多、您可能得到的帮助就越多。

    您是否使用示波器查看了 SSI2信号? 我使用您的代码构建了一个项目、我看到 SSICLK、SSITX 和 PB5用作 CS 正常输出。 我会仔细检查与 AT45DQ321的硬件连接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的回答。 我对此表示赞赏。 我实际上弄清楚了正在发生的情况。 但真正的问题是 launchpad 上的 R9和 R10。 事实证明、为了实现 MSP 兼容性、有一个跳线连接到 PB7和 PB6与端口 D 引脚。 我取出了这些电阻器、并且我能够输入字节。 唯一让我感到不满的是、发送运算代码后的第一个 siget 返回0x00。 在发送第一个虚拟字节后、我得到第一个实际 ID 字节1F。 我的印象是、在发送运算代码后 id 立即得到1F。 有什么想法来说明这种情况的原因?

    再次感谢

    此致、

    AJ

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

    [引用 user="AJ_e]]发送第一个虚拟字节后、我获得第一个实际 ID 字节1F。  我的印象是、在发送运算代码后 id 立即得到1F。

    正如您一样、"PUT"输出"Op Code Byte"(0x9F)-从器件的输出为"高阻抗"。   然而、这种"非数据"确实会到达 MCU 的 SPI 端口输入。   然后-在您的第一个"获取"时-这是"垃圾数据"(0x00)-您的 MCU 会将其存储在其 FIFO 中并通过"获取"显示。   然后、您的下一个"Put"(虚拟数据)将正确获取从属方的"Manuf"。 ID (0x1f)"-将其放在 FIFO 中。   因此、您可以"接受此单字节偏移-或在您的第一个"获取"之前发现"清除 SPI FIFO"的方法。

    我一直在使用另一家供应商的 ARM MCU、因此无法回忆"清除 FIFO"的严格过程、即使存在此过程也是如此。   (这里的其他人应该能够填补这个空白。)

    这里的许多人"早就注意到"(并高声抗议)这种可怕的选择是"短死"两对 MCU 引脚-这对您的"过度努力和沮丧负有很大责任!"   “振振振振”(R9/10)应该已经包括在一个袋子里,并由那些实际上可能寻求这种“兼容性”的人(很少)安装。

    BTW -串行闪存实际上是"顶层小屋"-我们尤其喜欢有两个512字节的 RAM -它可以实现快速芯片负载(同时)数据从 RAM 传输到闪存-理想...

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

    [引用 USER="CB1_MOBIT)]我一直在使用另一家供应商的 ARM MCU -因此无法回忆"清除 FIFO"的严格过程-如果存在这种情况、甚至是如此。   (此处的其他人应能够填补该空白。)[/QUERT]

    AFAIK 清除 FIFO 的唯一方法是读取 FIFO、直到它为空。 作为初始化代码、这应该是一个例程问题。

    Robert

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

    正如您建议的那样、初始化 FIFO 非常有意义。

    然而,有人怀疑(两个)海报和这位记者都证明“不能认出何时是空的?”    你可以建议吗?    (也许标记字节将被预加载-在它们不存在时(通过重复的"放置/获取"实现)、我们已经将一个 FIFO 字节设置为空?   那么呢?)

    正如海报上标注的那样-我确认了-当输入操作码时、器件输出"Hi-Z"。  (通过 MCU 的 Put)  、然后-在后续8个 SPI 时钟期间-制造厂商。 ID (0x1F)被发出。   然而、我们的海报报告收到"第一个0x00"不正确(0x1F)!

    这里的建议通常都是"依次放置"-这是否会阻止"背靠背"使用"获取"-减去它们的前导放置?    (即、不能在之前的"Get"之后立即输出  SPI 时钟、这将返回外部芯片数据?   

    (外部芯片的数据表注意到、器件在收到后续 SPI 时钟时输出所需的数据-不注意 MCU 数据输出-在这些时钟期间...)

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

    [引用 USER="CB1_MOBILE"]

    正如您建议的那样、初始化 FIFO 非常有意义。

    然而,有人怀疑(两个)海报和这位记者都证明“不能认出何时是空的?”    你可以建议吗?

    [/报价]

    您可能会过度思考这个问题。

    来自 SSIDataGetNonBlocking 的用户手册

    [引用 USER="TIVAWare 用户手册"]

    描述:
    此函数从指定 SSI 模块的接收 FIFO 中获取接收到的数据并将其放置
    将该数据写入 ui32Data 参数指定的位置。 如果 FIFO 中没有数据、
    然后、该函数返回0。

    [/报价]

    我的记忆是 TIVAWare 示例使用这种方法。

    Robert

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

    好的-非常感谢-但是、"返回零"有点"不舒服吗?"

    有时不是"真实数据"的"零"值?    (注意-我在使用其他 ARM MCU (180MHz 及更高频率)时会受到"干扰"-因此无法在此回顾这些细节...)

    您的努力受到赞赏-但我的疑虑是否有效?   (即零是一个非常常见的、接收到的 SPI 值!)  再次感谢、Robert。。

    [编辑/添加]"获取"生成 SPI 时钟的能力本身是否是真正的问题?    "8个多余时钟"的入侵-由 SPI" PUT "创建-证明在该外部器件的情况下没有任何价值-但会导致"无用"多余数据的到达...   海报应检查源代码以确定"GET"是否发出 SPI 时钟...

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

    CB1_MOBILE 说:
    您的努力受到赞赏-但我的疑虑是否有效?

    如果返回值包含数据。 返回值仅是状态(从技术上讲、它是数据项的数量、但由于它只能读取一个项目、因此返回值必须有效为零或一个)。

    数据实际上是通过在调用中传递的指针返回的。 一种相当常见的调用策略、允许以简单的内联方式测试状态。 在 C*中执行的另一种方法是将指针传递到状态标志并返回数据,但这种方法通常会更加尴尬,因为您无法再执行简单的内联测试,而且必须始终分配数据值 如果没有要返回的有效数据。 这并不会产生很大的差异、但第一种方法通常会产生更易于遵循的代码、许多样式指南建议仅使用状态返回值(或者、如果没有状态值要返回、则仅使用值的返回值的限制性更低)。

    Robert

    * C++有其他选项、它们是否适合嵌入式系统是另一个问题。

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

    谢谢您-但我怀疑海报(当然也是我)仍然感到困惑。

    不是、"SSIDataGetNonBlocking ()"、因为您很荣幸(之前)提供/定义了用于"接收 SPI 数据?"的函数     然而,本手册(通过演示文稿)介绍了(weasel 单词)“returned”(已返回)和“my (现在重复) read - Data & return”(数据和返回)源自SSIDataGetNonBlocking ()”。

    这不是正确的-可以吗?   采用单独的函数来"测试是否为空"和"从 SPI FIFO 中提取有效的 SPI 接收数据"似乎是有利的。    是这样吗?   是否(仅限) SPI"获取" SPI FIFO 接收有效 SPI 数据?     再次感谢。

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

    CB1_MOBIT 说:
    不是"SSIDataGetNonBlocking ()",因为您(之前)慷慨地提供/定义了用于"接收 SPI 数据?"

    的函数

    是的

    [引用 USER="CB1_MOBIT"] 然而,本手册(通过演示文稿)介绍了(weasel 单词)“returned”(已返回)和“my (现在重复) read - Data & Return (数据和返回)”(源自SSIDataGetNonBlocking ()”)。"/quote]

    让我引用整个描述

    [引用 user="TIVAWare 用户手册"]

    24.2.2.11 SSIDataGetNonBlocking


    获取 SSI 接收 FIFO 中的数据元素。


    原型:


    int32_t SSIDataGetNonBlocking (uint32_t ui32Base、uint32_t * pui32Data);

    参数:

    • ui32Base 指定 SSI 模块的基地址。
    • pui32Data 是指通过 SSI 接口接收数据的存储位置。


    描述:


    此函数从指定 SSI 模块的接收 FIFO 获取接收到的数据、并将该数据放置在 ui32Data 参数指定的位置。 如果 FIFO 中没有数据、
    然后、该函数返回0。

    注意:只有写入到 pui32Data 的值的低 N 位包含有效数据,其中 N 是 SSIConfigSetExpClk()配置的数据宽度。 例如、如果接口配置为8位数据宽度、则写入到 pui32Data 的值的低8位仅包含有效数据。


    返回:

    返回从 SSI 接收 FIFO 读取的元素数量。

    [/报价]

    该描述并不强调(也可能应该)它只从 FIFO 中读取一个项目。 请注意、描述不使用字 return 来描述读取数据的存储。 请注意、这是一种非常常见的调用技术。

    [引用 USER="CB1_MOBIST"] 采用单独的函数来"测试是否为空"和"从 SPI FIFO 中提取有效的 SPI 接收数据"似乎是有利的。    情况是否如此?

    我说不是*。 我认为在使用两个呼叫(单个呼叫工作正常)的情况下没有太大的好处(请注意警告)。

    [引用 USER="CB1_MOBIST"]  SPI "GET"是否 SPI FIFO 接收有效的 SPI 数据?  [/报价]

    如果我理解这个问题、非阻塞式 Get 是唯一需要状态的呼叫。 阻止获取在有数据之前不会返回、因此不需要状态。 请注意、可能会实现类似于(未注释、未测试、只是为了显示结构)的刷新循环

    void flush_SPI (void)
    {
    uint32_t 数据;
    
    while (SSIDataGetNonBlocking (SPI_Base、&data)!= 0){
    }
    }
    

    在读取固定缓冲器时、可能看起来是这样的(您显然希望在这方面有所改进、但它会让您产生更好的想法)

    void read_spi_device_buffer (uint32_t *数据、size_t buffersize)
    {
    
    while (buffersize > 0){
    if (SSIDataGetNonBlocking (SPI_Base、&data)!= 0){
    Data++;
    buffersize--;
    }
    }
    
    

    因此、我认为添加第二个调用不会澄清这里的代码。 我不认为 SSI 就是这样、但对于某些硬件来说、确定是否有数据的唯一方法是尝试读取数据。 在这种情况下、将其分解为单独的调用会使被调用代码变得相当复杂、这一点很小。

    Robert

    *我确实遇到了读取到指针是标准固定32位类型的问题、但这次讨论没有涉及到这一点。 基本参数也是如此。

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

    非常感谢 Robert -这是一个了不起的-高度关心、非常详细和广泛的技术解释。   我(再次)对你的债务非常沉重。

    我今天可能(特别胖)(员工注释"每天")、但我仍然被"值为零的有效 SPI 数据"可能出现在 FIFO 中的机会所吸引-这可能被错误地解释为" FIFO 空!"   (特别是-我们的许多显示控制器采用16位寄存器-通过 SPI 访问-这2个字节中的一个字节(构成16位寄存器)包含零并不罕见!)

    我已经阅读(并重新阅读)您慷慨提供的手册说明-但我仍然发现、对于有效 SPI FIFO 数据中的"零"外观、"没有答案"、如"除 FIFO 空信号之外!"   在我看来,这种可能性"没有得到适当/充分的考虑",因此"零核查"是有缺陷的。   我希望我已经充分解释了这一点。

    这是海报(非常理想)器件的一个重要摘录(它还包含超过1KB 的快速静态 RAM -这可能会"自动传输"到 EEPROM -而不会减慢"写入 RAM!"

    我在介绍该器件的时序图时要指出的是、"应该"放置"和"获得"输出8个 SPI 时钟-我们(不必要地交织)"垃圾字节"-具有原始的 SPI 接收数据。  如果"SPI Get"能够自行(减去使用先前的 Put)生成8个 SPI 时钟(如上图所示)、这是不好的-也可以避免的。

    因此、仍然存在两个问题:

    • 如何区分“SSIDataGetNonBlocking ()”产生的“零”与有效的 SPI 接收数据... 或者... SPI 为空的"信号"?    这种情况仍然不清楚。
    • 单独使用"GET"是否足以"从 SPI 从器件中提取数据"-避免因交织在一起的"Put"所引入的8个"多余时钟"而导致的"无意义数据"输入?

    我注意到、该器件(刚刚描述)证明了"合理的标准"-在呈现多个"背靠背"数据字节时-这些数据字节看起来都是 "延迟和不必要的互连/垃圾数据-由相互交织但毫无意义的"输出"引起的。

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

    [引用 USER="CB1_MOBIST"]我被以下可能性所吸引:"值为零的有效 SPI 数据"可能会出现在 FIFO 中-这种情况可能会被错误地解释为" FIFO 空!"[/QUERPLEG]

    我认为问题是你混淆了回返一词的两个不同含义。 用户手册小心地避免了将字返回用作读取 SPI FIFO 的同义词、我不是很小心。

    稍微扩展一下我的上一个示例

    void readfunc (void)
    {
    unit32_t dev_dat[6];
    
    read_spi_device_buffer (dev_dat、(size_t) 4):
    }
    
    void read_spi_device_buffer (uint32_t *数据、size_t buffersize)
    {
    
    while (buffersize > 0){
    if (SSIDataGetNonBlocking (SPI_Base、&data)!= 0){
    Data++;
    buffersize--;
    }
    }
    

    让我们假设您调用 readfunc、FIFO 中有四个值。 前两个为零、第三个为1、第四个为2。 现在、让我们逐步了解 READ_SPI_buffer 函数的执行情况并进行注释

    1. SSIDataGetNonBlocking 调用和的返回
    2. 放入调用函数中的 dev_dat 数组的值。

    首次调用 SSIDataGetNonBlocking

    1. 由于数据被读取、因此返回1
    2. DEV_dat[0]设置为0

    第二个调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[1]设置为0

    第三 次调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[2]设置为1

    第四 次调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[3]设置为2

    此时将不会有第四次调用、因为例程已读取要求其读取的所有值。

    让我们来做一个稍微不同的示例、在这种情况下、由于某种原因、FIFO 在第三次调用之前没有填满、但此时 FIFO 具有前面提到的相同值

    首次调用 SSIDataGetNonBlocking

    1. 由于没有要读取的数据、因此返回0
    2. 未记录 DEV_dat[0]是否发生更改。 最好假设它具有、但该值无效、因此应忽略它。

    第二个调用

    1. 由于没有要读取的数据、因此返回0
    2. 未记录 DEV_dat[0]是否发生更改。 最好假设它具有、但该值无效、因此应忽略它。

    第三个

    1. 由于数据被读取、因此返回1
    2. DEV_dat[0]设置为0

    第四 次调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[1]设置为0

    第五 次调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[2]设置为1

    第6 次调用

    1. 由于数据被读取、因此返回1
    2. DEV_dat[3]设置为2

    此时将不会有第四次调用、因为例程已读取要求其读取的所有值。

    这是否有助于清理问题并显示数据和状态不是混合在一起的?

    Robert

    请注意、在清零 FIFO 示例中、我故意忽略从 FIFO 中读取的任何值、方法是连续写入先前读取的值。

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

    Robert、

    再次感谢大家、我觉得我需要深入研究我们的许多 LPad 之一、输入代码、然后在 IAR 下进行观察。

    我在这里仍然"被治愈"

    if (SSIDataGetNonBlocking (SPI_Base、&data)!= 0)

    请原谅我-然而(仍然)我 看不到-当"&data"提取"zero"值时 -" 如果测试失败" 和 两个"条件操作 w/in"绕过了这个"if"。

    也许早期的"Read func()"使代码能够区分"FIFO 空"和"Legitmate FIFO 零值数据"之间的差异。

    对于其他 ARM 器件、我们采用了一个单独的位来通知"当 FIFO 为空时"-因此有效 FIFO 数据(偶数@ 0值)和" FIFO 空信号"(同样为零!)之间没有"冲突的可能性"

    使用"Get"-但没有(始终)链接/更早的"PUT"-和"Gets"生成 SPI 时钟的能力-在这里也仍然"有用"-特别是对于线程的创建者...

    再次非常感谢-我仍然无法正确理解"零"与其原因代理"匹配"的方式...

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

    嗯、应该存在一个语法错误

    if (SSIDataGetNonBlocking (SPI_Base、DATA)!= 0){ 

    希望这不会影响您的理解。

    请注意,*数据的值从未经过测试,只有 SSIDataGetNonBlocking 的返回值完全不同。

    [引用 USER="CB1_MOBIST"]对于我们使用的其他 ARM 器件,一个单独的位会通知“当 FIFO 为空时”-因此有效 FIFO 数据(偶数@零值)和“FIFO 空信号”(也为零!)之间没有“冲突的可能性”[/引用]

    这里也不可能发生这种情况。 数据和状态始终是分开的。

    Robert

    让我看看我是否可以提供一个简化的独立示例

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

    尤里卡!   即使是今天"在家生病"—也许现在这句话(单独)"帮助我得到这句话。"    (发生这种情况时、我会爱上它!)

    "请注意、*数据的值从未经过测试、只有 SSIDataGetNonBlocking 的返回值完全不同。"

    "获取"是"从 FIFO 中提取 SPI 数据的函数吗?"     如果这证明了这一点、那么使用"强制链接"(Put 和 Get 之间)会导致传输不需要的无效字节)是否符合您的协议?

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

    摆脱 I/O 行李、看看这是否能让它更清晰。 请注意、在这种情况下、我还将状态和计算(读取)值设置为不同类型、这可能有助于显示它们传输不同且完全独立的路径。

    #include 
    #include 
    #include 
    
    bool restricted_sine (双角、双*结果)
    {
    if ((角度< 0.0)||(角度> 3.0)){
    返回 false;
    }
    否则{
    *结果= sin (角度);
    返回 true;
    }
    
    }
    
    int main()
    {
    双分辨率;
    
    if (restricted_sine (2.0、&res)){
    printf ("成功、结果=%LF\n"、res);
    }
    否则{
    printf (“未成功\n”);
    }
    if (restricted_sine (4.0、&res)){
    printf ("成功、结果=%LF\n"、res);
    }
    否则{
    printf (“未成功\n”);
    }
    } 

    这种情况再次完全未经测试、但如果清除了不可避免的排印错误、则应运行。 它应该会产生类似的结果

    成功、结果= 0.909
    不成功

    如果这是合理的、您会看到非阻塞式读操作如何发生相同的情况、以使状态和数据保持分离、从而使0数据永远不会被解释为状态(实际上不能)。

    如果不是、则手动执行它。 如果存在交叉污染、请向我展示它的发生位置和方式。

    Robert

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

    [引用 USER="CB1_MOBIT"]即使今天"在家生病"-现在也许这句话(单独)"帮助我得到这句话。"

    我们遭受同样的命运。 昨天我抽取了两个小时的牙齿,今天我并不是最警觉的。

    [引用 USER="CB1_MOBIST]"GET"是"从 FIFO 中提取 SPI 数据的函数吗?"     [/报价]

    是的

    [引用 user="CB1_MOBIST"]  并且-如果这证明了情况-使用"强制链接"(Put 和 Get 之间)会导致传输不需要的无效字节)这是否符合您的协议?

    是的、您仍然必须执行常规修剪才能获取所需的数据。 这是特定于器件的操作。 FIFO 允许您输出一个命令字符串、然后读回整个批处理、而不是"逐字节"执行此操作。 只要事务能够放入 FIFO 中、就可以执行该操作。 在清除 FIFO 的情况下、已经发生了整个传输(如果有)、您只需读取并丢弃 FIFO 中可能存在的任何垃圾、无论原始原因是什么。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢-我的状态是"恶心/头晕"、最近两天我在床上睡了12个小时。 您的声音(非常)不有趣。

    那么、A、"只获得"(减去其附带的输入)的序列是否会成功? (为使其成立-我希望 Get (单独)不会产生所需的 SPI 时钟-而只是获取"从 FIFO 提取的数据"。) 也许吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引述 USER="CB1_MOBIT"]再次感谢您-我的情况是"恶心/眩晕"、最后两天在床上呆了12个小时[/QUERE]

    其余的在治疗床上? 听起来很不舒服、甚至很烦人。

    [引述 USER="CB1_MOBIT"]您的声音(非常)不有趣。[/QUERPLET]

    无法说、因为我喜欢它、但至少它看起来(也许?) 有待改进。 最后、牙医一直说"我知道你累了、但你能更宽地开口"、我想"我累了吗? 在过去半小时里、你一直在使用木工和砖石工工具"

    [引用 USER="CB1_MOBILE]A、"只获得"序列(减去其附带的输入)是否不会成功? (为使其成立、我希望 Get (单独)不会产生所需的 SPI 时钟、而只是获取"从 FIFO 提取的数据")[/QUERPILE]

    只要 FIFO 之前是空的、这就是您可以使用它们清空 FIFO 的原因、也是您在初始化时必须清空 FIFO 的原因。 时钟仅由 Put 生成。

    这也是您必须小心使用阻止形式或在 Get 上旋转的原因。 尝试读取太多条目将导致线程停止并旋转、从而模糊地等待另一条目。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你的声音"比我的声音更糟"——然而,庇护狗和猫的感觉是"有什么东西"——折磨我"比正常情况差"。
    关于"牙科指挥"-我总是喜欢"放松!" 真的-你有20K RPM 的 BLDC 钻机-深入我的"疼痛中心"-我要放松吗?

    然后、海报上的内容看起来很正常-他将收到 Put 命令提供的"与真实数据散布的垃圾字节"。

    非常清晰、您的"超越/超越"细节让"病者"更好地理解... 再次非常感谢...