一:有关SPI

rt中用户需要添加spi的注册和初始化文件如:drv_spi,里面需要做的是

static struct rt_spi_ops gd32_spi_ops =

{

configure,

xfer

};

初始化上面的结构体的两个函数,rt的底层spi中有用到这个结构体的两个函数

然后再初始化中将result = rt_spi_bus_register(&spi_bus0, "spi0", &gd32_spi_ops);相应的设备总线注册

然后再开发相应的外设设备(芯片)的驱动的时候

初始化中需要传入频率,模式和字节宽度

然后用

static int rt_hw_ssd1351_config(void)

{

rt_err_t res;

/* oled use PC8 as CS */

spi_cs.pin = CS_PIN;

rt_pin_mode(spi_cs.pin, PIN_MODE_OUTPUT);    /* 设置片选管脚模式为输出 */

res = rt_spi_bus_attach_device(&spi_dev_ssd1351, SPI_SSD1351_DEVICE_NAME, SPI_BUS_NAME, (void*)&spi_cs);   将相应的芯片的spi路给绑定上注册好的总线

if (res != RT_EOK)

{

OLED_TRACE("rt_spi_bus_attach_device!\r\n");

return res;

}

/* config spi */

{

struct rt_spi_configuration cfg;

cfg.data_width = 8;

cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;

cfg.max_hz = 20 * 1000 *1000; /* 20M,SPI max 42MHz,ssd1351 4-wire spi */

rt_spi_configure(&spi_dev_ssd1351, &cfg);   //在这里进行配置

}

return RT_EOK;

}

然后开始做芯片的寄存器初始化等

static int rt_hw_ssd1351_init(void)

{

rt_hw_ssd1351_config();

rt_pin_mode(DC_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(RES_PIN, PIN_MODE_OUTPUT);

rt_pin_write(RES_PIN, PIN_LOW);

//wait at least 100ms for reset

rt_thread_delay(100);

rt_pin_write(RES_PIN, PIN_HIGH);

ssd1351_write_cmd(0xfd); // Command Lock

ssd1351_write_data(0x12);

ssd1351_write_cmd(0xfd); // Command Lock

ssd1351_write_data(0xb1);

}

INIT_PREV_EXPORT(rt_hw_ssd1351_init);    /* 使用RT-Thread的组件自动初始化机制 */

(SPI的例子参考了往上的资料,具体可以搜索 ssd1351 rtthread)

相应的ssd1351_write_data函数内部调用rt提供的接口rt_spi_send(&spi_dev_ssd1351, &cmd, 1);

实际上使用的还是我们定义的xfer函数

串口的开发类似上面的套路,iic也是,要考虑不同的总线判断,然后配置函数config中考虑的参数是硬件上不同芯片是否需要做不同的配置选项,需要就作为参数传入

rt提供的接口函数可以参考rt的编程指南手册

二:添加相应的外设驱动说明:

1:添加相应的驱动模块的时候,比如加上hwtimer,需要配置kconfig,然后再env上menuconfig,然后选中选项,然后采用scons --target=mdk5进行重新更新程序

然后再rtconfig中添加相应的头文件宏定义,相应的头文件看rtdevice.h

然后相应的drv-xxx是用户自己写的

可以参考https://www.rt-thread.org/qa/thread-8284-1-1.html

2:开发各种总线注册的时候,最主要的是实现rt_xxx_ops这个结构体里面的函数接口,初始化完后开始注册操作,不同设备注册函数不同,相应的函数和接口要求看rt提供的app层接口文件,主要为的是rt_xxx_device结构体服务

分析一下各个rt_xxx_ops,特别是parent.user-data是用户注册设备的时候传进去的数据。

另外外设的初始化中需要用到各种芯片自己支持的函数库的相应的初始化结构体,比如gd32的是

xxx_parameter_struct

总结可以得出,需要用户实现对rt提供的外设的函数接口底层,再相应的设备driver中的文件和结构体:E:\rtt\rt-thread-master\components\drivers

可以参看:E:\rtt\rt-thread-master\bsp\gd32303e-eval\drivers 各外设驱动的文件,再工程上添加了相应的驱动源文件后,需要查看rtconfig.h是否开启的相应的宏,开了头文件才会被包含进来,否则报错,相应的宏查看rtdevice.h,然后去到rtconfig.h定义

关于rt-thread的外设驱动原理(例子spi)相关推荐

  1. xpt 2046的触摸屏 rt thread设备驱动框架

    1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...

  2. 外设驱动(一)E-Paper墨水屏扫描显示原理

    嵌入式应用笔记 此系列作为产品过程中记录开源库移植和一些遇到的问题,包括有效资源.要点.函数.方法和一些使用心得. 移植 开源库移植(一)轻量级环形缓冲区LwRB 驱动 驱动应用(一)低功耗墨水屏硬件 ...

  3. STM32 PWM输出原理和直流电机PWM驱动原理详解及例程

    这次讲一讲STM32输出PWM的原理以及PWM可以作为信号传输数据的原理. PWM会有很多地方用到,有控制灯的亮度,控制电机,控制舵机或者其他一些外设,有时候你的单片机所输出的PWM是作为信号去控制, ...

  4. 工业物联网LCD数码屏的驱动原理及低功耗设计(华大半导体HC32L136)

    目录 1.驱动原理 2.驱动程序 3.低功耗设计 在工业物联网传感器可视化设计时,仅仅为显示传感器的数值变化,多选用低成本.低功耗.尺寸合适的LCD数码屏,本次博客为各位分享华大半导体HC32L136 ...

  5. Linux主机驱动与外设驱动分离思想

    - by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...

  6. 树莓派GPIO驱动原理

    1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...

  7. 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮

    北京电子科技学院(BESTI) 实 验 报 告 封 面 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号: 20145222 20145213 成绩: 指导教师:娄嘉鹏 实验日期 ...

  8. spi 外设驱动(spi_driver)

    spi驱动模型和i2c的类似,都按照主机外设分离来设计的.但我觉得比i2c的要简明好多. 上文配置的spi驱动最外层是platform总线然后是spi总线然后是字符设备. spi驱动模型分为 spi主 ...

  9. [转]Linux主机驱动与外设驱动分离思想

    - by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在 Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设, ...

最新文章

  1. 用于3D摄像头的VCSEL技术
  2. 织梦怎么改网站主页php,无忧主机教你修改织梦DedeCms网站首页为动态显示的方法...
  3. java 取上下文路径_取Servlet上下文路径,取WebContent的路径
  4. 【Socket】linux网络多路复用IO技术
  5. 蒙牛 customer Project Support - 同时更新两个database table
  6. 几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...
  7. (转)Java随机数
  8. 三星Galaxy S20 5G版跑分曝光 骁龙865配12GB内存
  9. python题目关于企业利润_Python练习题(一)
  10. [GO]删除切片的某个值
  11. Redis闲谈:你一定需要的知识图谱
  12. 什么是搜索引擎?有什么作用?
  13. 那个人路过了青春一阵子,却会在记忆里搁浅一辈子
  14. steam游戏文件夹在哪儿?
  15. Android弹性滑动在自定义View中的高级应用
  16. 微信小程序自动保留空格换行
  17. 敏捷之路:如何开好迭代评审会
  18. r5处理器_Intel难受了,R5-4500U,6核心处理器笔记本价格才3499元
  19. 选择与循环:剪刀石头布_python项目:剪刀石头布游戏
  20. 证件照如何压缩到100kb

热门文章

  1. c语言比赛课程,C语言课件比赛.ppt
  2. 智能语音控制的荣耀FlyPods Pro,带你领略骨声纹识别的黑科技体验
  3. halcon测量:用卡尺找边
  4. Android App游戏去广告
  5. 澳大利亚:日本 3:1
  6. npm uninstall 卸载npm包
  7. HCIA——初步了解
  8. c#发送微信模板消息
  9. 四月项目进展 | DECENT发布2019路线图
  10. [C语言/C++]判断月份对应天数