查看SPI 总线精要的源代码
←
SPI 总线精要
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 概述 == 四根线:SS, SCK, MOSI, MISO 总线上的设备分主从模式 (Master and Slaver) 一条总线上可有多个从设备 Master 通过 SS 选择当前与之通信的从设备,因此如果有 10 个从设备,则 Master 需要有 10 条 SS 线 通讯时 Master 拉低 Slaver 对应的 SS 即使能 Slaver Master 发出的数据总是通过 MOSI,接受数据总是通过 MISO Slaver 发给 Master 的数据总是通过 MOSI,接受 Master 的数据总是通过 MISO SCK 是主从通讯的同步信号,Master 将其拉低则发送数据,拉高则读取数据 Master 发送一个字节数据的过程如下: <pre> Master 拉低 SCK 通过 MOSI 发送一位数据(1 则拉高 MOSI,0 则拉低 MOSI) 紧接着再拉高 SCK MISO 读取一位数据 </pre> 重复上述过程,直到 8 位数据发送完毕 <br><br> == 软件模拟 SPI 控制器 == <source lang=c> void spi_init() { CS = 1; SCK = 0; } char spi_transfer(char data) { char i; for(i=0; i<8; i++) { MOSI = (data & 0x80); data = (data << 1); SCK = 1; data |= MISO; SCK = 0; } return (data); } void chip_select() { CS = 0; } void chip_deselect() { CS = 1; } </source> 实际应用的进一步实现: <source lang=bash> /* following is independent function */ char spi_read_reg(char reg) { char reg_val; chip_select(); spi_transfer(reg); reg_val = spi_transfer(0); chip_deselect(); return (reg_val); } char spi_write_reg(char reg, char val) { char status; chip_select(); status = spi_transfer(reg); spi_transfer(val); chip_deselect(); return (status); } char spi_read_buf(char reg, char *pbuf, char uchar) { char status, i; chip_select(); status = spi_transfer(reg); for(i=0; i<uchar; i++) pbuf[i] = spi_transfer(0); chip_deselect(); return (status); } char spi_write_buf(char reg, char *pbuf, char uchar) { char status, i; chip_select(); status = spi_transfer(reg); for(i=0; i<uchar; i++) spi_transfer(*pbuf++); chip_deselect(); return (status); } </source> <br><br> == Micro SD == [[文件:Sd-card-pin-and-function.png]] <br> <br><br><br> <br><br><br> <br><br><br>
返回到
SPI 总线精要
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面