串口通信:
只要是使用串口通信,不论是TTL还是232、485,其驱动程序都是一样的,通过外接RS485芯片即可将串口转换为RS485信号。本节用的是串口3,串口驱动框架为:
1、uart_driver 注册与注销
每个串口驱动都需要定义一个 uart_driver,加载驱动的时候通过 uart_register_driver 函数向
系统注册这个 uart_driver,此函数原型如下:
int uart_register_driver(struct uart_driver *drv)
注销驱动的时候也需要注销掉前面注册的 uart_driver,需要用到 uart_unregister_driver 函数,
函数原型如下:
void uart_unregister_driver(struct uart_driver *drv)
2、uart_port 的添加与移除
int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
3、uart_ops 实现
imx_pops 就是 uart_ops 类型的结构体变量
RS232驱动编写方法:
1、 imx6ull-alientek-emmc.dts UART3 IO 节点创建
2、添加 uart3 节点
故障调试方法:
分为硬件和软件部分。硬件部分用示波器检测出规律的peak峰值信号,证明硬件没有问题。
软件部分检查驱动的编写、语法、及拼写有没有问题。
SPI通信
SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC
的 SPI 控制器接口。我们编写好 SPI 控制器驱动以后就可以直接使用了,不管是什么 SPI 设备,SPI 控制器部分的驱动都是一样,我们的重点就落在了种类繁多的 SPI 设备驱动。
一、SPI主机驱动
1、spi_master 申请与释放
struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
void spi_master_put(struct spi_master *master)
2、spi_master 的注册与注销(到内核)
int spi_register_master(struct spi_master *master)
void spi_unregister_master(struct spi_master *master)
二、SPI 设备驱动
1、spi_driver 申请与释放
int spi_register_driver(struct spi_driver *sdrv)
void spi_unregister_driver(struct spi_driver *sdrv)
2、spi_driver 的注册与注销(到内核)
spi_register_driver 来注册 spi_driver
spi_unregister_driver 来注销 spi_driver
三、SPI 设备和驱动匹配过程
of_driver_match_device 函数用于完成设备树设备和驱动匹配,比较 SPI 设备节点的 compatible 属性和 of_device_id 中的 compatible 属性是否相等,如果相当的话就表示 SPI 设备和驱动匹配。
主要是CS片选,转载一篇文章:
我们知道,SPI_NSS有两种模式,SPI_NSS_Hard和SPI_NSS_Soft。
SPI_NSS_Hard,硬件自动拉高拉低片选,在速率上是远比软件方式控制要高的,缺点是当STM32为主设备时,同一个SPI上面只能接一个从设备。这也就限制了SPI通信设备的数量。
SPI_NSS_Soft,软件控制,GPIO控制片选拉高拉低,优点是一个SPI上面可以挂多个设备。这也是使用较多的方式。所以不再讲述这个,主要讲一下SPI_NSS_Hard下,该如何配置及使用SPI。
STM32是可以自动拉高拉底的,但是是通过SPI_Cmd这个函数实现的,使能SPI,硬件自动拉低片选,取消使能SPI,硬件自动拉高片选。
delay_us(28);
SPI_Cmd(SPI2,ENABLE);
while(SPI_GetFlagStatus(SPI2,SPI_FLAG_TXE) == RESET);
SPI_SendData(SPI2,data);
while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE) == RESET);
SPI_ReceiveData(SPI2);
SPI_Cmd(SPI2,DISABLE);
这是我使用的时候,一段简单的SPI通信的示例,请按照实际修改。