cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 6 MCU

New Contributor

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
Reply
1 Solution
Moderator
Moderator

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
Reply
10 Replies
Moderator
Moderator

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

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

0 Likes
Reply
New Contributor

你好,

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

pastedImage_0.png

0 Likes
Reply
Moderator
Moderator

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
Reply
New Contributor

你好,其实我使用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
Reply
Moderator
Moderator

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

0 Likes
Reply
New Contributor

感谢解答,我后来转换思路尝试直接操作寄存器。我现在有个方案是从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
Reply
Moderator
Moderator

应该是 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
Reply
New Contributor

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

0 Likes
Reply
Moderator
Moderator

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
Reply
New Contributor

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

0 Likes
Reply
Top labels