王昱顺 发表于 2024-3-3 16:05:03

STC32F技术手册笔误 20240202版本|有关超时寄存器

本帖最后由 王昱顺 于 2024-3-5 10:45 编辑

备注:32G手册也是有这个问题的
第589页



I2C部分也有同样的错误
第615页




王昱顺 发表于 2024-3-3 16:07:03

本帖最后由 王昱顺 于 2024-3-3 16:37 编辑

顺便问一下这个


测试多种方法都无法进入超时中断,直接判断标志位也没发现超时中断标志位置1.
请问有没有关于SPI超时中断的测试程序学习一下?

xxkj2010 发表于 2024-3-3 17:52:57

楼主很细心,发现笔误了{:4_250:}

乘风飞扬 发表于 2024-3-3 18:57:07

王昱顺 发表于 2024-3-3 16:07
顺便问一下这个




附件是STC32F做SPI从机使能超时中断的例子,供参考:



王昱顺 发表于 2024-3-3 19:12:37

乘风飞扬 发表于 2024-3-3 18:57
附件是STC32F做SPI从机使能超时中断的例子,供参考:

好的非常感谢

王昱顺 发表于 2024-3-5 08:33:21

乘风飞扬 发表于 2024-3-3 18:57
附件是STC32F做SPI从机使能超时中断的例子,供参考:

你好,经过测试发现了一些小问题,芯片是STC32F12K54 固件版本号7.4.6U



这部分是SPI的初始化代码,现在出现的问题是。如果上电后不做任何动作,正常开始发数据以后就不会进入超时中断
如果拔掉SCLK信号线,则可以进入超时中断,重新插回去如果时机得当,则会开始正常的触发超时中断。


设置的是CPLO=0;CPHA=1;SCLK不动作为低电平。看示波器里面的数据应该是没有问题的。
为什么超时计时不生效呢?
<font size="5">void SPI_Init(void)
{
    P_SW2 |= 0x80;                           // 扩展寄存器(XFR)访问使能
    SPSTAT = 0xc0;                           // 清除标志位
    SPCTL = 0xe7;                              // 忽略SS引脚功能,使能SPI功能,LSB优先,主机模式,下降沿采样数据,速率/4=52/4=13Mhz
    ESPI = 1;                                  // 关闭SPI中断功能
    SPDAT = 0xaa;                              // 设置回复的第一个字节
    DMA_SPI_STA = 0x00;                        // 清零DMA标志位
    DMA_SPI_CFG2 = 0x03;                     // 不自动控制SS,SS引脚为P3.5
    DMA_SPI_CFG = 0xab;                        // 使能SPI_DMA中断,禁止发送,允许接收。中断优先级3,总线访问优先3
    DMA_SPI_CR = 0x81;                         // 允许SPI_DMA功能,开始操作前清空FIFO
    DMA_SPI_RXAH = (u8)((u16)&show_test >> 8); // SPI发送数据存储地址
    DMA_SPI_RXAL = (u8)((u16)&show_test);
    DMA_SPI_AMT = 0xff;
    DMA_SPI_AMTH = 0xff; // 拉满接收大小
    HSSPI_CFG2 |= 0x28;// 启动高速SPI模式,打开FIFO
    SPITOCR = 0x00;      // 关闭超时中断
    SPITOTH = 0x13;
    SPITOTL = 0x88;
    IAP_TPS = 52;
    HSCLKDIV = 0x00;      //高速时钟1分频,默认2分频
}</font>

乘风飞扬 发表于 2024-3-5 09:34:36

王昱顺 发表于 2024-3-5 08:33
你好,经过测试发现了一些小问题,芯片是STC32F12K54 固件版本号7.4.6U




现有超时中断产生条件有2个:
1. 收满一个字节(8位数据)
2. 超时时间内没有收到新的数据
判断一下这两个条件能不能都满足,建议先直接使用前面提供的例程测试,正常后再进行修改或移植。

小涵子爸爸 发表于 2024-3-5 09:53:08

看的太仔细了,赞

王昱顺 发表于 2024-3-5 10:25:16

乘风飞扬 发表于 2024-3-5 09:34
现有超时中断产生条件有2个:
1. 收满一个字节(8位数据)
2. 超时时间内没有收到新的数据


那有可能是数据漏了一位(整体偏移)导致的等待8位数据收满卡死。
我再仔细检查一下数据的波形,谢谢。

程序就是使用的例程进行移植

王昱顺 发表于 2024-3-5 10:43:10

本帖最后由 王昱顺 于 2024-3-5 10:44 编辑

乘风飞扬 发表于 2024-3-5 09:34
现有超时中断产生条件有2个:
1. 收满一个字节(8位数据)
2. 超时时间内没有收到新的数据

谢谢,已经成功实现超时功能了。

问题存在是刚刚启动SPI设备的时候会有随机的几个脉冲。会造成SPI数据错位。


解决办法是初始化的时候通过预置SPI引脚电平为0后,打开普通上拉模式,强制给各个端口拉低到0。此时杂乱数据没法被读入。等通过SCCB配置完设备,启动了SPI_DMA开始读取后,再恢复SPI引脚为高阻模式,开始读取数据。此时的数据就没有错位了,而且超时功能也可以正常使用


建议把这些判断条件也写入到手册里面的超时部分,这样方便出现问题的时候进行排查
页: [1] 2
查看完整版本: STC32F技术手册笔误 20240202版本|有关超时寄存器