一个MCU如何挂8个spi设备

seubaikal
煮象池 2021-11-04 字数 63

菊花链搞起来会不会有问题

如果,使用片选驱动8个,驱动能力可能不行

Circuit 电路设计与调试
13 个回复
julala
julala 2021-11-04

每个Slave一个片选啊,又不是片选一驱8,有什么问题?

【 在 seubaikal 的大作中提到: 】

: 菊花链搞起来会不会有问题

: 如果,使用片选驱动8个,驱动能力可能不行

ECUCoder
Engineer 2021-11-04

用片选区分就可以,驱动能力不够的话时钟SCK上、数据输出SDO上加一个硬件缓冲器增强驱动能力,带几十个设备都没有问题的。

菊花链多麻烦,坏一个挂一串,系统鲁棒性太差。

【 在 seubaikal 的大作中提到: 】

: 菊花链搞起来会不会有问题

: 如果,使用片选驱动8个,驱动能力可能不行

tom6bj
tom 2021-11-04

怕gpio不够的话上个74hc138之类的3-8译码器

MOSI/SCK驱动能力不够的话加个74LVC1G08之类,我试过带8个595没问题

【 在 seubaikal (煮象池) 的大作中提到: 】

: 菊花链搞起来会不会有问题

: 如果,使用片选驱动8个,驱动能力可能不行

dismoon
伐开心要包包 2021-11-04

建议I2C

【 在 seubaikal 的大作中提到: 】

: 菊花链搞起来会不会有问题

: 如果,使用片选驱动8个,驱动能力可能不行

commander
南无奥特曼佛 2021-11-05

I2C倒是省端口,就是这个时序啊ack啊nack啊一堆乱七八糟的实在不讨人喜欢

【 在 dismoon 的大作中提到: 】

: 建议I2C

tom6bj
tom 2021-11-05

我写了个简单的软i2c库, 效率低些, 不用折腾这么多了

https://github.com/tomzbj/zi2c

【 在 commander (南无奥特曼佛) 的大作中提到: 】

: I2C倒是省端口,就是这个时序啊ack啊nack啊一堆乱七八糟的实在不讨人喜欢

datou618
痒痒熊熊 2021-11-05

【 在 tom6bj 的大作中提到: 】

: 我写了个简单的软i2c库, 效率低些, 不用折腾这么多了

https://github.com/tomzbj/zi2c

: ...................

dismoon
伐开心要包包 2021-11-05

低速通讯实在没必要SPI,除非你有任务强实时,需要SPI给IRQ信号

不然你一秒钟N个I2C轮询一遍没啥大区别。

楼主都能问到一个SPI上用CSN挂8个了,说实话我估计用嗓子喊一声的通讯也够

【 在 commander 的大作中提到: 】

: I2C倒是省端口,就是这个时序啊ack啊nack啊一堆乱七八糟的实在不讨人喜欢

dismoon
伐开心要包包 2021-11-05

我上git经常抽风,不然我倒是可以分享一个把I2C当一个handler任务句柄挂载在任务列表里,时钟到了指针去I2C,不用你这种delay3us强制系统空闲的方法

【 在 tom6bj 的大作中提到: 】

: 我写了个简单的软i2c库, 效率低些, 不用折腾这么多了

https://github.com/tomzbj/zi2c

: ...................

tom6bj
tom 2021-11-06

上rtos了都好办,用os提供的delay替换delay_us就行了呗

【 在 dismoon 的大作中提到: 】

: 我上git经常抽风,不然我倒是可以分享一个把I2C当一个handler任务句柄挂载在任务列表里,时钟到了指针去I2C,不用你这种delay3us强制系统空闲的方法

: 【 在 tom6bj 的大作中提到: 】

: ....................

dismoon
伐开心要包包 2021-11-06

我没用RTOS啊,我是根据RTOS基本原理自己拿了个时钟做任务序列,我现在大程序还是一个while(1)大循环

我不过是极限压榨核心

【 在 tom6bj 的大作中提到: 】

: 上rtos了都好办,用os提供的delay替换delay_us就行了呗

: :

tom6bj
tom 2021-11-06

上具体代码看看?

delay不用上下文切换又不破坏原有流程的话, 我还真没想到你的好办法

【 在 dismoon (伐开心要包包) 的大作中提到: 】

: 我没用RTOS啊,我是根据RTOS基本原理自己拿了个时钟做任务序列,我现在大程序还是一个while(1)大循环

: 我不过是极限压榨核心

dismoon
伐开心要包包 2021-11-06

不用上代码,写个大概原理都能懂。就是机器启动的时候直接开辟固定SRAM区域给多个任务,startup里把堆拉高,然后时钟里挂一个指针变量,一旦任务有延时,就把指针给其他任务,然后延时到了指针跳回来。

不是中断跳转,是固定的,在一个函数固定的地方把资源让出来给其他函数,到了时间跳回来而已。

要中断跳转肯定要保护现场,不上RTOS我也没办法

主要是有一阵F1芯片经常没法让外部晶振起振,而我当时有个产品设计初衷是用24MHz的,结果只能用8M内部时钟,

后来一看很多外部原件特别是I2C经常要延时,索性就把延时给其他函数跑。

【 在 tom6bj 的大作中提到: 】

: 上具体代码看看?

: delay不用上下文切换又不破坏原有流程的话, 我还真没想到你的好办法

: ...................