TI BLE CC2541的SPI主模式
SPI就是用4条线来串行传输数据, 2541只能用模拟的方式用GPIO来做.
//******************************************************************************
// INCLUDES
//******************************************************************************
#include <ioCC2541.h>
#include "hal_spi_master.h"
#include "OSAL.h"
#include "hal_mcu.h"
#include <string.h>
#define SPI_CS P1_4
#define SPI_CLK P1_5
#define SPI_MOSI P1_6
#define SPI_MISO P1_7
//4个GPIO引脚
#define SPI_MAX_PACKET_LEN 39
#define SPI_MAX_DATA_LEN 35
const uint8 W25X_ReadData=0x03;
void startSending(void);
void _nop_(void){
}
//下面的delay 1ms在红外遥控器里面改写过, 因为需要更精确的delay.
void SPI_DLY_ms(unsigned int ms)
{
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}
void SPI_DLY_us(unsigned int us)
{
unsigned int a;
while(us)
{
a=2;
while(a--);
us--;
}
return;
}
void SPI_Init(void)
{
P1SEL &= 0x0F; //将 P1.4 P1.5 P1.6 P1.7 设置为GPIO引脚 00001111
P1DIR |= 0x70; //设置 P1.4 P1.5, p1.6 引脚为输出, P1.7 为输入 01110000
SPI_SendByte(0xff);
}
void SPI_GetFlashID(void){
uint16 Temp = 0;
//startSending();
SPI_CS=0;
SPI_SendByte(0x90);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
Temp|=SPI_ReadByte()<<8;
Temp|=SPI_ReadByte();
SPI_CLK=1;
_nop_();
SPI_CS=1;
}
void W25Q64_Read(uint8* pBuffer,uint8* readAddr,uint16 NumByteToRead){
int i;
SPI_CS=0;
SPI_SendByte(0x03);
//SPI_SendByte((uint8)((ReadAddr)>>16));
//SPI_SendByte((uint8)((ReadAddr)>>8));
SPI_SendByte(readAddr[0]);
SPI_SendByte(readAddr[1]);
SPI_SendByte(readAddr[2]);
//SPI读W25Q时, 先发页地址.
//SPI_SendByte((uint8)ReadAddr);
for(i=0;i<NumByteToRead;i++){
pBuffer[i]=SPI_ReadByte(); //循环读
}
SPI_CLK=1;
_nop_();
SPI_CS=1;
}
//发送一个字节, 基本上先拉低使能CS脚, 然后不断的时钟高低, 在时钟的后变化沿, 就是所谓clock tailing edge, 读MISO值.
uint8 SPI_ReadByte(void){
unsigned char i=0, in=0, temp=0;
//SPI_CS=0;
//先拉低, 然后拉高的时候, 读取MISO
SPI_CLK = 0;
for(i=0;i<8;i++){
in = (in << 1);
SPI_CLK = 1;
//SPI_DLY_us(1);
temp = SPI_MISO;
if (temp == 1){
in = in | 0x01;
}
SPI_CLK = 0;
//SPI_DLY_us(1);
}
//SPI_CS=1;
return in;
}
//发送字节也是一样, 先拉低时钟, 然后发送, 然后拉高.
void SPI_SendByte(uint8 cmd){
unsigned char i=8, temp=0;
//SPI_CS=0;
for(i=0;i<8;i++){
SPI_CLK=0;
temp = cmd&0x80;
if (temp == 0)
{
SPI_MOSI = 0;
}
else
{
SPI_MOSI = 1;
}
cmd<<=1;;
SPI_CLK=1;
//SPI_DLY_us(1);
}
SPI_MOSI=1;
}
重点是配合逻辑分析仪使用, 用STM32的板子硬件SPI的波形做参考, 慢慢调就行.
TI BLE CC2541的SPI主模式的更多相关文章
- TI BLE CC2541的I2C主模式
由于要写TM1680, 写命令跟写数据, 所以需要使用CC2541的I2C, 2541是有硬件I2C的. tm1680.c: #include "tm1680.h" //TM168 ...
- TI BLE CC2541的通讯协议.
包类型: 01命令/02数据/03应答消息 开始标志FF/本数据包长度(注意是16进制)/校验码/包ID/包类型01: 表示是命令/01表示下面要开始传输/03字符串编号/字符串长度/结束位FEFF ...
- STM32之spi管理模式
1)sip管理模式分为:硬件管理和软件管理:主要由NSS .SSI.SSM决定: NSS是芯片上一个实实在在的引脚,SSI和SSM是SPI_CR1控制器里的的位. 值得注意的是:NSS分外部引脚和内部 ...
- TI BLE协议栈软件框架分析
看源代码的时候,一般都是从整个代码的入口处开始,TI BLE 协议栈源码也不例外.它的入口main()函数就是整个程序的入口,由系统上电时自动调用. 它主要做了以下几件事情: (一)底层硬件初始化配 ...
- Nginx+keepalived双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- MySQL+MGR 单主模式和多主模式的集群环境 - 部署手册 (Centos7.5)
MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR是MySQL官方在5.7.17版本引进的一个数据库高可用与 ...
- nginx+keepalived高可用及双主模式
高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...
- Keepalived+LVS实现高可用负载均衡双主模式
LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...
- Mysql组复制之单主模式(一)
环境 系统:CentOS release 6.9 (Final) Mysql:5.7 机器: S1 10.0.0.7 lemon S2 10.0.0.8 lemon2 S3 10.0.0.9 lemo ...
随机推荐
- 使用C语言把字母转换成大写,不能使用库函数
char to_upper(char input) { if ('a' <= input && input <= 'z') { return input - ' ...
- JavaScript:JavaScript事件的处理
JavaScript事件处理 —————事件的处理流程: —————动态事件绑定: —————常用的事件处理. 1.事件的概念 在页面之中,会针对用户的每一个操作进行记录.在页面中的事件可以简单的理解 ...
- Mac OS—苹果搭建Android开发环境
如何在MAC OS X 安装Android SDK 我以往用的开发环境都是以MAC OS安装VMware来跑不同的Windows OS,目前慢慢的将所要开发的项目由以往的传统的Wintel转移到Mob ...
- [GDAL]GEOS和Proj4编译
1.下载源码 geos-3.4.2.tar.bz2 http://trac.osgeo.org/geos/ proj-4.8.0.zip http://trac.osgeo.org/proj ...
- Http authentication(BASIC, DIGEST)
Http authentication....BASIC: In the context of an HTTP transaction, basic access authentication is ...
- Protostuff序列化
前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializabl ...
- Three.js基础探寻九——网格
在学习了几何形状和材质之后,我们就能使用他们来创建物体了.最常用的一种物体就是网格(Mesh),网格是由顶点.边.面等组成的物体:其他物体包括线段(Line).骨骼(Bone).粒子系统(Partic ...
- C++之路进阶——codevs2460(树的统计)
2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节 ...
- 使用sql对数据库进行简单的增删改查
1.创建表 create table 表名( 列名 列的类型, 列名 列的类型, 列名 列的类型 (注意自后一列不能加‘ ,’) ); 2.修改表 修改表名--> rename 旧表名 t ...
- spark standalone zookeeper HA部署方式
虽然spark master挂掉的几率很低,不过还是被我遇到了一次.以前在spark standalone的文章中也介绍过standalone的ha,现在详细说下部署流程,其实也比较简单. 一.机器 ...