嵌入式开发中模拟SPI的驱动

这里贴一下自己的模拟SPI驱动,移植的话需要实现SPI管脚的定义和初始化。

一、管脚初始化

  • MOSI_PIN:设置MOSI为输出模式
  • SCK_PIN:设置SCK为输出模式
  • CSN_PIN:设置CSN为输出模式
  • MISO_PIN:设置MISO为输入模式
  • MOSI_PIN_HIGH:设置MOSI为高电平
  • MOSI_PIN_LOW:设置MOSI为低电平
  • SCK_PIN_HIGH:设置SCK为高电平
  • SCK_PIN_LOW:设置SCK为低电平
  • CSN_PIN_HIGH:设置CSN为高电平
  • CSN_PIN_LOW:设置CSN为低电平

二、模拟SPI时序

模拟时序的时钟设置为500kHz,即时钟拉高1us,拉低1us。

/*!* \brief   Simulate SPI read-timing method, base-read driver* \para    none* \retval  read_val:uint8_t*/
static uint8_t SPI_Read_OneByte(void)
{uint8_t i;uint8_t read_val = 0;for(i=0; i < 8; i++){val <<= 1;SCK_PIN_HIGH;         if(MISO_PIN == 1)read_val |= 0x01;elseread_val &= ~0x01;delay_us(1);//500KHz SPISCK_PIN_LOW;delay_us(1);//500kHz SPI}return read_val;
}
/*!* \brief   Simulate SPI write-timing method, base-write driver* \para    write_val:uint8_t* \retval  none*/
static void SPI_Write_OneByte(uint8_t write_val)
{uint8_t i;for(i=0; i < 8; i++){if(write_val & 0x80)MOSI_PIN_HIGH;elseMOSI_PIN_LOW;SCK_PIN_HIGH;write_val <<= 1;delay_us(1);//500KHz SPISCK_PIN_LOW;delay_us(1);//500KHz SPI}
}

三、SPI对外接口API

使用SPI_WriteData和SPI_ReadData操作SPI设备和外设。

/*!* \brief   SPI write buff method, api driver* \para    addr:uint8_t,reg addrdataptr:uint8_t *,pointer of SPI write bufflength:uint16_t, size of buff* \retval  none*/
void SPI_WriteData(uint8_t addr, uint8_t *dataptr, uint16_t length )
{int i;CSN_PIN_LOW;SPI_Write_OneByte(addr|WR_CMD); for(i = 0; i < length, i++)SPI_Write_OneByte(dataptr[i]);CSN_PIN_HIGH; 
}
/*!* \brief   SPI read buff method, api driver* \para    addr:uint8_t,reg addrdataptr:uint8_t *,pointer of SPI read bufflength:uint16_t, size of buff* \retval  none*/
void SPI_ReadData(uint_t addr, uint8_t *dataptr, uint16_t length )
{uint8_t value;int i;CSN_PIN_LOW; SPI_Write_OneByte(addr|RR_CMD);for(i = 0; i < length, i++)dataptr[i] = SPI_Read_OneByte();  CSN_PIN_HIGH;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始整理资料

现在想想为什么这么晚才在CSDN安家&#xff0c;如果大一的时候就开始写博客了&#xff0c;记录生活的点点滴滴&#xff0c;那该有多好。 回去以前做过的许多事情&#xff0c;总是一知半解&#xff0c;如果当时能够想到写博客&#xff0c;那么理解程度就不是现在这个样子了。 知…

[react] 你有使用过React Intl吗?

[react] 你有使用过React Intl吗&#xff1f; 一种react国际化的解决方案 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题 个人简介 我是歌谣&#xff0c;欢迎和…

C语言编程对缓冲区的理解

解析C语言编程对缓冲区的理解 转载自&#xff1a;http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识。 一、什么是缓冲区 缓冲区又称为缓存&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些…

ftp文档服务器设置,ftp服务器基本设置

ftp服务器基本设置 内容精选换一换在迁移Agent中输入华为云账号AK/SK以后&#xff0c;AK/SK校验失败。Windows系统提示用户&#xff1a;"AK/SK authentication failed. Ensure that the system time is consistent with the standard time and the AK and SK are corre服务…

浅谈进程间的消息传递

From: http://blog.csdn.net/handsomewang527/article/details/1676259 随着我们开发的应用的日益复杂&#xff0c;像以往那样将所有功能坐在一个exe文件中情况越来越少&#xff0c;更多时候是整个应用由若干模块、甚至若干单独的exe文件组成&#xff0c;这就涉及到了模块或进…

树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

一、SPI接口 树莓派3B上的SPI接口如下所示&#xff0c;有两组SPI&#xff0c;分别由CE0和CE1来进行选择。 首先查看树莓派的SPI是否启用&#xff0c;在/dev查看是否有spidev0.0和spidev0.1 如果不存在spi设备号&#xff0c;需要在raspi-config中启用&#xff0c;在命令行输入&…

能说明你的Javascript技术很烂的五个原因

Javascript在互联网上名声很臭&#xff0c;但你又很难再找到一个像它这样如此动态、如此被广泛使用、如此根植于我们的生活中的另外一种语言。它的低学习门槛让很多人都称它为学前脚本语言&#xff0c;它另外一个让人嘲笑的东西是动态语言的概念是偏偏使用了高标准的静态数据类…

[react] 除了实例的属性可以获取Context外哪些地方还能直接获取Context呢?

[react] 除了实例的属性可以获取Context外哪些地方还能直接获取Context呢&#xff1f; Context React.createContext<Context.Provider value{contextValue}> child </Context.Provider>使用 组件式: <Context.Consumer>{contextValue > ...}</Conte…

饥荒专用服务器全图显示代码,饥荒开全图代码

用记事本打开游戏目录\data\DLC0001\scripts\prefabs\player_common.lua文件&#xff0c;在inst:AddComponent("resurrectable")下一行插inst:AddComponent("resurrectable")下一行插入以下内容&#xff1a;  TheInput:AddKeyUpHandler(KEY_1&#xff0c…

树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

一、SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细&#xff0c;移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成&#xff0c;因此只需要用到DIO0。如果要用到CAD&#xff0c;则需要DIO1管脚。 发送时&#xff1a;DioMapping1寄存器…

linux系统中如何查看日志 (常用命令2)

cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志&#xff0c;是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/maillog 与邮件相关的日志信息 /var/log/cron 与定时任务相关的日志信息 /var/log/spooler 与…

VMware View 与 Citrix Xendesktop 管理大比拼

一篇写得非常不错的博文&#xff0c;从管理角度来对比虚拟桌面产品的差异&#xff0c;而这一点往往被代理商和用户忽略&#xff0c;值得花时间看看。 大部分用户决定使用桌面虚拟化的最大原因是简化管理。我深刻的记得2006年在X福记用户那推补丁管理软件时&#xff0c;结…

[react] childContextTypes是什么?它有什么用?

[react] childContextTypes是什么&#xff1f;它有什么用&#xff1f; childContextTypes用来定义context数据类型&#xff0c;该api从16.3开始已被废弃 使用方式 class MessageList extends React.Component {getChildContext() {return {color: "purple"};}rend…

readdirectorychangesw 链接错误 undeclared identifier 解决方法

From: http://aaronaddis.blog.163.com/blog/static/1270893292010431101042517/ 今天在编程中遇到了文件监控的东西&#xff0c;在使用readdirectorychangesw 函数是老是报未定义的错误&#xff0c;看了MSDN&#xff0c;包含了windows.h和Winbase.h 两个头文件&#xff0c;但…

matlab 画箱线图boxplot简单用法

代码示例&#xff1a; data1rand(5,1);%列向量 data2rand(5,1);%列向量 data3rand(5,1);%列向量 data[data1,data2,data3]; boxplot(data,Labels,{data1,data2,data3}); 更多请参考&#xff1a; matlab官网文档&#xff1a;https://www.mathworks.com/help/stats/boxplot.htm…

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏,请使用关键字 new。...

“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏&#xff0c;请使用关键字 new。 一旦运行就显示&#xff1a;“FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意…

[react] 为什么React并不推荐我们优先考虑使用Context?

[react] 为什么React并不推荐我们优先考虑使用Context&#xff1f; 1、Context目前还处于实验阶段&#xff0c;可能会在后面的发行版本中有很大的变化&#xff0c;事实上这种情况已经发生了&#xff0c;所以为了避免给今后升级带来大的影响和麻烦&#xff0c;不建议在app中使用…

思科数据中心Nexus 3000

思科数据中心新战略 将推Nexus 3000等产品 ZDNET网络频道&#xff1a;2011-03-07&#xff1a;网界网 本文关键词&#xff1a;思科 数据中心 思科计划很快推出一款为频繁的金融交易设计的数据中心交换机&#xff0c;或者还可能推出类似于瞻博网络最近发表的QFabric的一种交换机结…

VC++文件监控(一) ReadDirectoryChangesW

From: http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC实施文件监控&#xff1a;实例和详解 相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html 我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控 关键代码…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类

一、概述 关于LSTM同系列的前一篇文章写的是利用LSTM网络对电力负荷进行预测【LSTM预测】&#xff0c;其本质是sequence-to-sequence problems&#xff0c;序列到序列的预测应用。这里做一下sequence-to-label classification problems&#xff0c;序列到标签的分类应用【LSTM…