rtthread工业使用_RT Thread SPI设备 使用
后记:
之前,我把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设备 使用相关推荐
- RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60
系列文章目录 RT-Thread (1) 添加外部内存到内存管理 RT-Thread (2) RTT SPI设备驱动流程 || LWIP + ENC28J60 RT-Thread (3) 为RTT增加 ...
- 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 ...
- RT_threadのSPI设备驱动W25Q/NM25Q128
目录 前言 1 将NM25Q挂载到SPI总线上 2 读取NM25Q的设备ID 3 读取NM25Q状态寄存器1 4 写NM25Q状态寄存器1 5 使能NM25Q的写 6 失能NM25Q的写 7 用户读取 ...
- 二十、SPI设备驱动及应用(一)
先给出Linux SPI子系统的体系结构图: SPI子系统体系结构 下面开始分析SPI子系统. Linux中SPI子系统的初始化是从drivers/spi/spi.c文件中的spi_init函数开始的 ...
- 28335接两个spi设备_SPI浅析
01 SPI简介 SPI,全称为Serial Peripheral interface,即串行外围设备接口.由摩托罗拉率先在产品上使用.SPI是一种高速全双工,同步(full duplex sync ...
- 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 修改项目 ...
- imx7d 通过imx7d-sdb.dts 添加 spi设备
通过nxp yocto工程获得的kernel 对应的imx7d-sdb.dts并不包含spi设备(即 在/dev/下没有spidev0.0 和 spidev1.0),想要访问spi设备需要自己添加.废 ...
- Linux SPI设备驱动
实现了SPI OLED外设驱动,OLED型号为SH1106. 1.主机驱动与外设驱动分离 Linux中的I2C.SPI.USB等总线驱动,都采用了主机(控制器)驱动与外设(设备)驱动分离的思想.主机端 ...
- imx6ul spi 设备驱动开发
imx6ul spi 设备驱动开发 spi设备树格式 spi设备树配置 spi 驱动 设备树解析 spi设备驱动使用 spi通用设备驱动 spi测试工具 spi时序对比 spi api 接口 spi设 ...
最新文章
- .NET编码解码(HtmlEncode与HtmlEncode)
- Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload
- entity framework 6 我写了一个公用数据类
- flash mini播放器
- vue v-for 不能自能渲染问题
- 高速缓冲存储器的功能、结构与工作原理
- 大疆口袋相机美颜怎么设置_灵眸Osmo口袋云台相机评测-大疆灵眸云相机使用说明...
- ubuntu 12.04 3D特效
- linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...
- [转] 如何制作华为手机的刷机包
- SQL简体繁体转换函数
- 释放IP地址,然后重新获取的两个命令
- PFC161台湾应广单片机PFC161S08A/PFC161S08B带硬件触摸功能单片机
- win10易升_小科普 | 彻底关闭Win10自动更新
- java.lang.RuntimeException:Unable to start activity ComponentInfo{com.meizu.beautify/com.my.viewc.Ma
- Word控件Spire.Doc 【文本】教程(14) ;如何用图片替换Word中的文字
- 如何使用OBS开启直播
- 吊炸天!程序员定制版高效摸鱼神器...
- Dev-C++的下载和安装步骤 超级详细教程来喽!
- hls网页播放器实现
热门文章
- kingcms php 搜索,KingCMS内容管理系统
- Linux下重启磁盘盘符会变,linux系统 重启盘符错乱问题
- Mac 下 移动硬盘只读解决方案
- java设置页码_Java 添加页码到Word文档
- 天主教七宗罪(你范了那些条)
- Machine Learning with Graphs 之 Traditional Methods for Machine Learning in Graphs
- Java后端笔记 _Static关键字
- INE深圳硅谷双线发布演讲实录 | CEOCTO羽睿-去中心化的最后一块版图
- Android面试题和答案
- 简析Acrel-1000安科瑞变电站综合自动化系统选型与应用