后记:

之前,我把SPI的片选在Cubemx中配置成了SPI_NSS。

现在我给它改为了GPIO_OUTPUT.  同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT的系统API的调用流程)。

年初第一天上班,有空回过头来看这个问题,就成功解决了。

------Sx1278.h-----------------------------------------------------------------------------------------------------

#ifndef __SX1278_H__

#define __SX1278_H__

#include "drv_gpio.h"

struct spi_sx1278_device

{

struct rt_device sx1278_device;

struct rt_spi_device * rt_spi_device;

struct rt_mutex lock;

void * user_data;

};

typedef struct spi_sx1278_device * rt_spi_sx1278_device_t;

// 引脚定义

#define Sx1278_IRQ_PIN GET_PIN(C, 8)

#define Sx1278_nCS_PIN GET_PIN(B, 12)

#define Sx1278_RST_PIN GET_PIN(C, 9)

// 引脚状态

#define ST_SX1278_IRQ() rt_pin_read(Sx1278_IRQ_PIN)

// 引脚输出

#define SX1278_SPI_NCS_H() rt_pin_write(Sx1278_nCS_PIN, PIN_HIGH);

#define SX1278_SPI_NCS_L() rt_pin_write(Sx1278_nCS_PIN, PIN_LOW);

#define SX1278_SPI_RST_H() rt_pin_write(Sx1278_RST_PIN, PIN_HIGH);

#define SX1278_SPI_RST_L() rt_pin_write(Sx1278_RST_PIN, PIN_LOW);

typedef rt_uint8_t u8;

typedef rt_uint16_t u16;

typedef rt_uint32_t u32;

void test(void);

#endif

------Sx1278.c-----------------------------------------------------------------------------------------------------

#include "board.h"

#include "drv_spi.h"

#include "Sx1278.h"

#define SPI_BUS_NAME         "spi2"

#define SPI_SX1278_DEVICE_NAME   "spi20"

void hdr_callback(void *args)// 回调函数

{

char *a = args; // 获取参数

rt_kprintf("KEY_PIN down! %s\n",a);

}

//struct stm32_hw_spi_cs

//{

// rt_uint32_t pin;

//}; 不自己定义了,新的STM32 BSP 的drv_spi.h 有如下定义

// drv_spi.h 内定义:

//struct stm32_hw_spi_cs

//{

// GPIO_TypeDef* GPIOx;

// uint16_t GPIO_Pin;

//};

static struct stm32_hw_spi_cs spi_cs; /* SPI设备CS片选引脚 */

static struct spi_sx1278_device spi_sx1278_device;

#define CS_PIN 28 // Sx1278_nCS_PIN

static u8 SX1278_spiReadWriteByte(const u8 Sdata)

{

u8 Rdata[13] = {0};

// rt_pin_write(CS_PIN, PIN_LOW); /* 先 低电平 */

// rt_spi_send_then_recv第一个形参:struct rt_spi_device *device;

rt_spi_send_then_recv( spi_sx1278_device.rt_spi_device, &Sdata, (rt_size_t)1, Rdata, (rt_size_t)1);

// rt_spi_send(spi_sx1278_device.rt_spi_device, &Sdata, 1);

return Rdata[0];

}

int rt_hw_spi2_config(const char * spi_device_name)  // 这里填的就是"spi20"为参数。这里应该直接直接命名参数为const char * device name

{                                                                                     // spi_device_name是spi总线设备的意思, 对应的是"spi2"总线。

rt_err_t res;

struct rt_spi_device * rt_spi_device;

rt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);

// 这个不用根据SPI设备名字 来 查找 设备

//res = rt_spi_bus_attach_device(spi_sx1278_device.rt_spi_device, SPI_SX1278_DEVICE_NAME, SPI_BUS_NAME, (void*)&spi_cs);

spi_cs.GPIOx = GPIOB;

spi_cs.GPIO_Pin = GPIO_PIN_12;

// 这个要根据SPI设备名字 来 查找 设备 功能1: 把spi20挂到spi2上

res = rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_SX1278_DEVICE_NAME, spi_cs.GPIOx, spi_cs.GPIO_Pin);

if( res == RT_EOK )

{

rt_kprintf("\n rt_hw_spi_device_attach(), OK! \r\n");

}

rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name);

spi_sx1278_device.rt_spi_device = rt_spi_device;

if(spi_sx1278_device.rt_spi_device == RT_NULL)

rt_kprintf("\n Wrong ! \r\n");

/* 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 = 1 * 1000 *1000; /* 20M,SPI max 42MHz,ssd1351 4-wire spi */

res = rt_spi_configure(spi_sx1278_device.rt_spi_device, &cfg);

if( res == RT_EOK )

{

rt_kprintf("\n rt_spi_configure(), OK! \r\n");

}

}

return RT_EOK;

}

rt_err_t rt_hw_SX1278_config(const char * sx1278_device_name, const char * spi_device_name)

{

rt_hw_spi2_config(sx1278_device_name);

return RT_EOK;

}

static int rt_hw_SX1278_init(void)

{

// rt_hw_SX1278_config( "spi2", "spi20");         参数填写错误

rt_hw_SX1278_config( "spi20", "spi2");      // 参数填写正确

// SX1278 部分

// IO 方向

rt_pin_mode(Sx1278_IRQ_PIN, PIN_MODE_INPUT_PULLUP);

rt_pin_mode(Sx1278_RST_PIN, PIN_MODE_OUTPUT);

// SX1278中断

rt_pin_attach_irq(Sx1278_IRQ_PIN, PIN_IRQ_MODE_FALLING, hdr_callback, (void*)"CallBack args"); // 绑定中断,下降沿模式,回调函数

rt_pin_irq_enable(Sx1278_IRQ_PIN, PIN_IRQ_DISABLE); // PIN_IRQ_DISABLE、PIN_IRQ_ENABLE

// IO初值设置

rt_pin_write(Sx1278_nCS_PIN, PIN_HIGH);

rt_pin_write(Sx1278_RST_PIN, PIN_HIGH);

return 0;

}

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

u8 WirelessInit(u8 channel, u8 pa)

{

u8 result=0;

// SX1278_DisableInt();

//SX1278_SetLoRaPA(pa);

// SX1278_Init(channel);// 初始化

//

//sG_RfState = ST_RF_RECE;// 接收状态

//

//SX1278_EnableInt();

return result;

}

void Delay_1ms(u8 x)

{

//rt_thread_mdelay(x);

rt_thread_delay(x);

}

void SX1278_Reset(void)

{

static int sPowerUpFlag=1;

SX1278_SPI_RST_H();

Delay_1ms(2);

SX1278_SPI_RST_L();// 至少100us

Delay_1ms(2);

SX1278_SPI_RST_H(); // 至少5ms

if(sPowerUpFlag)

{

sPowerUpFlag = 0;

Delay_1ms(12);// 第一次上电,延时时间长一点

}

else

{

Delay_1ms(7);

}

}

static u8 SX1278Read(u8 adr)

{

u8 tmp;

SX1278_SPI_NCS_L();

SX1278_spiReadWriteByte(adr); // Send address first

tmp = SX1278_spiReadWriteByte(0xFF);

SX1278_SPI_NCS_H();

return tmp;

}

void test(void)

{

u8 TempReg;

u8 timeOutCnt=0;

SX1278_Reset();rt_thread_mdelay(500);

while(1)

{

TempReg = SX1278Read(0x06);

//rt_kprintf("Hard SPI TempReg = %d \r\n", TempReg);

rt_thread_delay(50);

}

}

rtthread工业使用_RT Thread SPI设备 使用相关推荐

  1. RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60

    系列文章目录 RT-Thread (1) 添加外部内存到内存管理 RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60 RT-Thread (3) 为RTT增加 ...

  2. IOT-OS之RT-Thread(十五)--- SDIO设备对象管理 + AP6181(BCM43362) WiFi模块

    文章目录 一.AP6181 Wi-Fi模块简介 1.1 AP6181 硬件接口 1.2 AP6181 驱动层级 二 SDIO设备对象管理 2.1 SDIO Bus Driver 2.1.1 Host ...

  3. RT_threadのSPI设备驱动W25Q/NM25Q128

    目录 前言 1 将NM25Q挂载到SPI总线上 2 读取NM25Q的设备ID 3 读取NM25Q状态寄存器1 4 写NM25Q状态寄存器1 5 使能NM25Q的写 6 失能NM25Q的写 7 用户读取 ...

  4. 二十、SPI设备驱动及应用(一)

    先给出Linux SPI子系统的体系结构图: SPI子系统体系结构 下面开始分析SPI子系统. Linux中SPI子系统的初始化是从drivers/spi/spi.c文件中的spi_init函数开始的 ...

  5. 28335接两个spi设备_SPI浅析

    01  SPI简介 SPI,全称为Serial Peripheral interface,即串行外围设备接口.由摩托罗拉率先在产品上使用.SPI是一种高速全双工,同步(full duplex sync ...

  6. 14010.xilinx-EMIO扩展SPI设备

    文章目录 1 背景 2 扩展spi操作 2.1 正常扩展spi操作 2.2 非正常扩展spi操作 2.2.1 原理图 2.2.2 修改linux内核中spidev.c添加设备节点 2.2.2 修改项目 ...

  7. imx7d 通过imx7d-sdb.dts 添加 spi设备

    通过nxp yocto工程获得的kernel 对应的imx7d-sdb.dts并不包含spi设备(即 在/dev/下没有spidev0.0 和 spidev1.0),想要访问spi设备需要自己添加.废 ...

  8. Linux SPI设备驱动

    实现了SPI OLED外设驱动,OLED型号为SH1106. 1.主机驱动与外设驱动分离 Linux中的I2C.SPI.USB等总线驱动,都采用了主机(控制器)驱动与外设(设备)驱动分离的思想.主机端 ...

  9. imx6ul spi 设备驱动开发

    imx6ul spi 设备驱动开发 spi设备树格式 spi设备树配置 spi 驱动 设备树解析 spi设备驱动使用 spi通用设备驱动 spi测试工具 spi时序对比 spi api 接口 spi设 ...

最新文章

  1. .NET编码解码(HtmlEncode与HtmlEncode)
  2. Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload
  3. entity framework 6 我写了一个公用数据类
  4. flash mini播放器
  5. vue v-for 不能自能渲染问题
  6. 高速缓冲存储器的功能、结构与工作原理
  7. 大疆口袋相机美颜怎么设置_灵眸Osmo口袋云台相机评测-大疆灵眸云相机使用说明...
  8. ubuntu 12.04 3D特效
  9. linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...
  10. [转] 如何制作华为手机的刷机包
  11. SQL简体繁体转换函数
  12. 释放IP地址,然后重新获取的两个命令
  13. PFC161台湾应广单片机PFC161S08A/PFC161S08B带硬件触摸功能单片机
  14. win10易升_小科普 | 彻底关闭Win10自动更新
  15. java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.Ma
  16. Word控件Spire.Doc 【文本】教程(14) ;如何用图片替换Word中的文字
  17. 如何使用OBS开启直播
  18. 吊炸天!程序员定制版高效摸鱼神器...
  19. Dev-C++的下载和安装步骤 超级详细教程来喽!
  20. hls网页播放器实现

热门文章

  1. kingcms php 搜索,KingCMS内容管理系统
  2. Linux下重启磁盘盘符会变,linux系统 重启盘符错乱问题
  3. Mac 下 移动硬盘只读解决方案
  4. java设置页码_Java 添加页码到Word文档
  5. 天主教七宗罪(你范了那些条)
  6. Machine Learning with Graphs 之 Traditional Methods for Machine Learning in Graphs
  7. Java后端笔记 _Static关键字
  8. INE深圳硅谷双线发布演讲实录 | CEOCTO羽睿-去中心化的最后一块版图
  9. Android面试题和答案
  10. 简析Acrel-1000安科瑞变电站综合自动化系统选型与应用