Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

PSoC™ 6 Forum Discussions

user_4807976
Level 1
Level 1
5 replies posted Welcome! First question asked

Hi All,

     我使用 PSoc62 example:High_Level_SPI_Master 调试SPI,因为我的应用要求发送命令与命令之间的SS拉高时间要尽量短(<1us),我将example简化为不停发送CommandPacket:

pastedImage_5.png

/*=========================================================================*/

以及在WriteCommandPacket()内注释了延时函数:

pastedImage_6.png

但是经过测试发现实际SS拉高时间长达10us:

pastedImage_7.png

经过调试我猜想是SPI_transfer过程中需要等待一些处理,但是我找不到什么原因为什么会占用这么多时间,请问有什么方法可以使SS高电平<1us?谢谢。

0 Likes
1 Solution

Technical Reference Manual (TRM) 文件有两个一个叫 Architecture TRM, 一个叫 Register TRM。 你需要看的是 Architecture TRM, 这个文档是芯片内部系统和外设的技术文档, Register TRM 只讲解寄存器。

PSoC® 6 MCU: PSoC 62 Architecture Technical Reference Manual

View solution in original post

0 Likes
10 Replies
ShipingW_81
Moderator
Moderator
Moderator
500 replies posted 250 solutions authored 250 replies posted

有一种方法可以去掉package之间的SS脚的拉高,在SPI master的配置框内,勾选“Deassert SS Between Data Elements”.

另一种可能减少SS拉高时间的方法,是提高SPI的时钟频率,但是要相应调整data rate和oversample值适配应用需求。

0 Likes

你好,

     这个方法我也有试过,但是会出现我不希望的CS拉高,我希望的是在一次CS拉低周期内发送完所有TX_buff,而且一段数据与数据之间的CS高电平维持时间还是很长(≈10.25us),谢谢。

pastedImage_0.png

0 Likes

SS 拉高的这段时间是 SPI TX FIFO 为空的时间,假设 CPU 每次向 TX FIFO 写入 5个 bytes, 间隔 A us 写入一次。5 bytes 全部送出所需的时间是  B us, 如果 A>>B 那就会出现你现在看到的情况  SS 在每一帧数据之间存在长时间的等待。

减小这个等待时间,你可以选择使能 TX FIFO EMPTY 的中断,然后根据中断的提醒在一帧数据传输完毕之后立刻传输下一帧数据。更好的方法是使用 DMA 配合 SPI TX FIFO 进行数据传输

0 Likes

你好,其实我使用example:Low_Level_DMA_SPI_Master 简单修改成不停发送SPI命令:

pastedImage_0.png

CS拉高持续的时间是变短了(5.75us),但是也挺长的:

pastedImage_2.png

我调试了几天代码,我从Low_Level_Polling_SPI_Master / High_Level_SPI_Master / Low_Level_DMA_SPI_Master 三个示例代码都试过了,每段5*8bits的SPI代码发送后,CS拉高的持续时间总会很长,期间期间也没有做任何其他事情,CPU主频也是按照默认的100MHz在跑。我要怎么样做才能控制CS拉高这段时间再1us以内?谢谢。

0 Likes

这还是同样的问题,这几个 code example 在将每一帧(5bytes)数据写入 TX FIFO 时帧与帧的写入操作之间都存在明显的间隔。你只有吧这个间隔做小才能控制 SS 的拉高时间。比如说你有 100 帧 500 bytes 数据需要发送,那么完全可以使用 DMA 一次性传送过去,这样SS 可以一直拉低。

0 Likes

感谢解答,我后来转换思路尝试直接操作寄存器。我现在有个方案是从microchip平台移植Cypress,参数都是M4@100MHz SPI@5MHz,实测两者参数相同,步骤思路都是:

     1.手动拉低CS

     2.按照buff长度依次写入SPI的TX_FIFO

     3.等待传输完成

     4.按照buff长度依次读取SPI的RX_FIFO

     5.手动拉高CS

A,原方案SPI实现程序与时序(直接操作寄存器,CS拉高时间<1us):

pastedImage_1.png

pastedImage_0.png

B.使用Cypress CY8C6247 SPI实现程序与时序(我这里同样直接操作寄存器,CS拉高时间<1us)

pastedImage_3.png

pastedImage_6.png

但是新的问题来了,这一个包4个8bits数据,每个buff之间发送间隔居然有2us,后来我加上了debug代码,并观察CS和GPIO1的电平:

pastedImage_7.png

     黄色CS VS 绿色GPIO:

pastedImage_8.png

低电平时为 while(!(CY_SCB_SPI_MASTER_DONE==Cy_SCB_SPI_GetSlaveMasterStatus(SPIM_HW)));

等待CY_SCB_SPI_MASTER_DONE这段时间也太长了点(>2us,和逻辑分析仪看的的时间接近),按道理说硬件SPI模块应该是写入TX_FIFO之后数据就会马上发送出去的,而且我没有使能任何中断,到底是为什么会造成这段长时间的等待?谢谢。

0 Likes

应该是 SPI DONE 这个状态的等待检测拖慢了你的通信,从常规思路去考虑 SPI DONE 应该不是 TX FIFO 数据发送完毕之后马上就被触发的状态,应该是在发送完全结束之后检测到 FIFO 在一定时间内没有写入新的数值才判定 DONE 的动作,所以这里会有一些延时。

从你的code可以了解你想要的通信方式,我觉得你没有必要每次向TX WR FIFO 写入一个 byte 之后都去检测 SPI DONE 的动作, SPI TX FIFO 的深度是 128(8BIT) 和 64(16-BIT), 你完全可以一次性的把 5 个 byte 通过  for loop 写入 TX FIFO,中间不做任何检测,所有数据写入完毕之后再检测 SPI Done 状态。 这样做你应该也不需要手动设置 SS 信号了,在 FIFO 中的所有数据发送完毕之前 SS 应该不会再拉高了。

0 Likes

好的,非常感谢,我在研究一下。请问Cypress官方有针对PSoc6系列SPI的详细说明文档吗,我只在官网找到简单的DATA SHEET(CY8C62x6_CY8C62x7_Datasheet)以及PSoc6系列的寄存器说明(PSoC6 MCU CY8C61x5, CY8C62x5 Registers Technical Reference Manual PSoC 62 MCU),但这两份都没有针对SPI模块的详细描述,谢谢。

0 Likes

Technical Reference Manual (TRM) 文件有两个一个叫 Architecture TRM, 一个叫 Register TRM。 你需要看的是 Architecture TRM, 这个文档是芯片内部系统和外设的技术文档, Register TRM 只讲解寄存器。

PSoC® 6 MCU: PSoC 62 Architecture Technical Reference Manual

0 Likes

好的,非常感谢您热心的支持,祝你工作顺利生活愉快,谢谢。

0 Likes