当前位置:   article > 正文

从SPI协议学习PX4源码_px4 spi

px4 spi

一、SPI类 

SPI类的参数:设备名称,devname设备节点名称,总线,device片选信号线,SPI模式,时钟频率,中断。SPI类继承VDev类。

SPI协议在spi.cpp文件中,涉及到了cdev和device的操作。cdev字符设备是linux系统设备之一。还有块设备,网络设备。cdev是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据。字符设备是面向流的设备,包括键盘,显示屏,串口。linux用户程序通过设备文件来使用驱动程序操作字符设备。cdev与incode的关系:incode成员含有cdev结构体成员的指针。cdev与file_operations的关系:cdev_init()建立cdev与file_operations之间的连接,为字符设备驱动提供接口函数,比如open,read,write等。

字符设备驱动结构cdev介绍 - 知乎 (zhihu.com)

SPI初始化:

连接总线_dev = up_spiinitialize(_bus),取消选择设备使得引脚电平由高变低(取消片选信号),检查设备是否在线(默认在线),初始化cdev(SPI类是基于cdev类的派生类,初始化cdev会创建设备节点)。

SPI传输:

  1. case LOCK_PREEMPTION: {
  2. irqstate_t state = irqsave();
  3. result = _transfer(send, recv, len);
  4. irqrestore(state);
  5. }
  6. break;    
  7. case LOCK_THREADS:
  8.         SPI_LOCK(_dev, true);
  9.         result = _transfer(send, recv, len);
  10.         SPI_LOCK(_dev, false);
  11.         break;
  12. int SPI::_transfer(uint8_t *send, uint8_t *recv, unsigned len)
  13. {
  14. SPI_SETFREQUENCY(_dev, _frequency);
  15. SPI_SETMODE(_dev, _mode);
  16. SPI_SETBITS(_dev, 8);
  17. SPI_SELECT(_dev, _device, true);
  18. /* do the transfer */
  19. SPI_EXCHANGE(_dev, send, recv, len);
  20. /* and clean up
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/849703
推荐阅读
相关标签
  

闽ICP备14008679号