OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4722|回复: 5

STM32MP157 SPI驱动修改,以及硬件片选

[复制链接]

21

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2018-10-19
在线时间
147 小时
发表于 2021-3-2 10:01:03 | 显示全部楼层 |阅读模式
最近需要调一下SPI的外设,以前都没整过SPI(奈何I2C太常用了),对比内核自带的SPI外设驱动和原子提供的例程发现,icm20608.c的SPI操作需要自己手动的拉片选信号,内核自带的外设不需要。下面提供修改方法。
1:修改设备树cs-gpios  = <&gpioz 3 GPIO_ACTIVE_HIGH>;(stm32mp157d-atk.dtsi)
2:放开驱动被注释掉的部分master->setup = stm32_spi_setup;以及stm32_spi_setup(spi-stm32.c)
第一次修改以为这样就可以了,发现去除icm20608关于片选的GPIO操作还是不行,经过研究发现icm20608.c也要做适当的修改:
微信截图_20210302094624.png

微信截图_20210302094607.png
微信截图_20210302094557.png
微信截图_20210302091043.png
现在基本SPI就可以使用了,但是通过看内核代码发现这个片选还是手动操作的,具体可以看spi.c的spi_transfer_one_message函数里面有个spi_set_cs函数,就是操作片选的。下面提供我自己改成硬件片选的步骤
1:修改设备树注释掉cs-gpios  = <&gpioz 3 GPIO_ACTIVE_HIGH>(使用硬件片选了)
2:修改stm32mp15-pinctrl.dtsi设备树添加SPI1_NSS的复用信息<STM32_PINMUX('Z', 3, AF5)
3:修改寄存器SPI_CFG2的bit29打开硬件片选
4:注释掉stm32_spi_probe函数中关于cs-gpios的操作

微信截图_20210302090733.png

cs.png
2.png


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

758

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5230
金钱
5230
注册时间
2019-9-25
在线时间
428 小时
发表于 2021-4-6 09:13:11 | 显示全部楼层
帮顶,对调spi的道友们有好处
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-30
在线时间
2 小时
发表于 2021-4-16 11:00:34 | 显示全部楼层
请教下, /dev/下为什么没有spi设备,我看到了/dev/icm20608/ 我想只使用spi 这个设备该怎么办
回复 支持 反对

使用道具 举报

21

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2018-10-19
在线时间
147 小时
 楼主| 发表于 2021-4-19 10:47:43 | 显示全部楼层
武者 发表于 2021-4-16 11:00
请教下, /dev/下为什么没有spi设备,我看到了/dev/icm20608/ 我想只使用spi 这个设备该怎么办

查一下设备树有没有提供device,没有device是在/dev下看不到的。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-30
在线时间
2 小时
发表于 2021-4-19 16:41:35 | 显示全部楼层
汪志鹏 发表于 2021-4-19 10:47
查一下设备树有没有提供device,没有device是在/dev下看不到的。

我修改了设备树,可以看到spi设备了,但是操作SPI的时候片选还是没有起作用。用逻辑分析仪可以看到数据正常发出去了,但是看不到片选的变化。

设备树修改
&spi1 {
   pinctrl-names = "default", "sleep";
   pinctrl-0 = <&spi1_pins_a>;
   pinctrl-1 = <&spi1_sleep_pins_a>;
   cs-gpio = <&gpioz 3 GPIO_ACTIVE_HIGH>;
   status = "okay";
        spidev@0x00 {
        compatible = "spidev";
                #address-cells = <1>;
        #size-cells = <0>;
        reg = <0>; /* CS #0 */
        spi-max-frequency = <8000000>;
    };
};


下面是测试
root@ATK-stm32mp1:~# ./spi_test -D /dev/spidev0.0 -H 1 -O 1 -v -p 12345678 - N
spi mode: 0x3
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | 31 32 33 34 35 36 37 38 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  |12345678|
RX | 00 00 00 00 00 00 00 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  |........|
回复 支持 反对

使用道具 举报

21

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
449
金钱
449
注册时间
2018-10-19
在线时间
147 小时
 楼主| 发表于 2021-4-21 14:05:47 | 显示全部楼层
武者 发表于 2021-4-19 16:41
我修改了设备树,可以看到spi设备了,但是操作SPI的时候片选还是没有起作用。用逻辑分析仪可以看到数据正 ...

我测试的时候也是用SPIdev来测试的,你把MOSI和MISO短接试试
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 22:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表