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主模式的更多相关文章

  1. TI BLE CC2541的I2C主模式

    由于要写TM1680, 写命令跟写数据, 所以需要使用CC2541的I2C, 2541是有硬件I2C的. tm1680.c: #include "tm1680.h" //TM168 ...

  2. TI BLE CC2541的通讯协议.

    包类型: 01命令/02数据/03应答消息 开始标志FF/本数据包长度(注意是16进制)/校验码/包ID/包类型01: 表示是命令/01表示下面要开始传输/03字符串编号/字符串长度/结束位FEFF  ...

  3. STM32之spi管理模式

    1)sip管理模式分为:硬件管理和软件管理:主要由NSS .SSI.SSM决定: NSS是芯片上一个实实在在的引脚,SSI和SSM是SPI_CR1控制器里的的位. 值得注意的是:NSS分外部引脚和内部 ...

  4. TI BLE协议栈软件框架分析

    看源代码的时候,一般都是从整个代码的入口处开始,TI  BLE 协议栈源码也不例外.它的入口main()函数就是整个程序的入口,由系统上电时自动调用. 它主要做了以下几件事情: (一)底层硬件初始化配 ...

  5. Nginx+keepalived双机热备(主主模式)

    之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...

  6. MySQL+MGR 单主模式和多主模式的集群环境 - 部署手册 (Centos7.5)

    MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR是MySQL官方在5.7.17版本引进的一个数据库高可用与 ...

  7. nginx+keepalived高可用及双主模式

    高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...

  8. Keepalived+LVS实现高可用负载均衡双主模式

    LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...

  9. 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 ...

随机推荐

  1. mysql按条件查询当条件是数字的时候加不加引号是一样的。

    select * from user where id=1 select * from user where id="1" 在查询的注意是否需要加上"";

  2. iOS: 悬浮的条件筛选下拉框的使用

    1.介绍 app中条件筛选视图是很常用的功能,一般它搭配着tableView的表头悬浮滚动使用,点击按钮时,就会弹出下拉框显示条件,选择一个条件后,下拉框自动隐藏. 2.效果图如下 从中间点击弹出,然 ...

  3. you need to upgrade the working copy first

    is too old (format 29) to work with client version '1.9.4 (r1740329)' (expects format 31) 2016年09月18 ...

  4. MVC 读书笔记

    一.路由 1.HttpApplication中的ASP.NET MVC .Net 3.5 引入了System.Web.Routing程序集,通过Url Routing的机制,可以实现将一个虚拟路径的请 ...

  5. iOS 设置导航栏的颜色和导航栏上文字的颜色

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  6. linux查看公网地址

    curl cip.cc curl http://members.3322.org/dyndns/getip

  7. AVAudioPlayer init 报错: Error Domain=NSOSStatusErrorDomain Code=1937337955

    Error Domain=NSOSStatusErrorDomain Code=1937337955 原因: 音频文件的格式不规范导致 对于iOS7以上的系统(含iOS7),在确定文件格式的情况下可以 ...

  8. sql server常见服务

    根据您决定安装的组件,SQL Server 安装程序将安装以下服务: SQL Server Database Services - 用于 SQL Server 关系数据库引擎的服务. 可执行文件为 & ...

  9. JSP 使用框架frame

    JSP使用框架放在<head>标签里面.如果放在<body>标签里面,用Tomcat打开,是不会显示的.

  10. AngularJs Test demo &front end MVVM implementation conjecture and argue.

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...