【CC2530-操作外部flash】

zigbee cc2530操作flash,以cc2530读flash_id为例子;

void InitIO()
{
  CLKCONCMD &= ~0x40;         //设置系统时钟源为32MHZ晶振 
  while(CLKCONSTA & 0x40);    //等待晶振稳定为32M 
  CLKCONCMD &= ~0x47;         //设置系统主时钟频率为32MHZ     
  UartInitial();
  // CS P1_3
  P1DIR |= 1<<3;
  P1INP |= 1<<3;
  P1SEL &= ~(1<<3);
  // IC_SCK  P1_5
  P1DIR |= 1<<5;
  P1INP |= 1<<5;
  P1SEL &= ~(1<<5);
   // IC_MOSI P1_6
  P1DIR |= 1<<6;
  P1INP |= 1<<6;
  P1SEL &= ~(1<<6);
  // IC_MISO P1_7
  P1DIR |= 1<<7;
  P1INP |= 1<<7;
  P1SEL &= ~(1<<7);  
  P1DIR |= 1<<2;
  P1INP |= 1<<2;
  P1SEL &= ~(1<<2);  
  
  SPI_CS = 1;
  SPI_SCK = 1;
}

操作写一个字节数据

/************************************************
函数名称 : Write_SPI_Byte
功    能 : SPI写读一个字节
参    数 : Byte ---- 数据
返 回 值 : Byte ---- 数据
*************************************************/
uint8_t Write_SPI_Byte( uint8_t Byte )
{
	uint8_t i;
 
	SPI_SCK = 1;
	
	for(i = 0;i < 8;i++)
	{
		SPI_SCK = 0;
		Delay_1us(WAIT_TIME);       // 空等待
		
	#if 0
        SPI_MOSI = ((Byte & 0x80) >> 7);
		
	#else
		if(Byte & 0x80)
	        {
			SPI_MOSI = 1;
		}
		else
		{
			SPI_MOSI = 0;
		}
		
	#endif
		Byte <<= 1;
		Delay_1us(WAIT_TIME);       // 空等待
		SPI_SCK = 1;
		Delay_1us(WAIT_TIME);       // 空等待
		//Byte |= SPI_MISO;
	}
	
	return Byte;
}

操作读flash数据

/************************************************
函数名称 : Read_SPI_Byte
功    能 : SPI只读一个字节
参    数 : 无
返 回 值 : temp ---- 数据
*************************************************/
uint8_t Read_SPI_Byte(void)
{
	uint8_t i;
	uint8_t temp = 0;
 
	SPI_SCK = 1;
	
	for(i = 0;i < 8;i++)
	{
		SPI_SCK = 0;
		Delay_1us(WAIT_TIME);       // 空等待
		temp <<= 1;
		
	#if 1
		temp |= SPI_MISO;
		
	#else
		if(SPI_MISO)
		{
			temp++;
		}
		
	#endif
		SPI_SCK = 1;
		Delay_1us(WAIT_TIME);       // 空等待
	}
	
	return temp;
}

测试以读取flash_id为例子,需要写0x90然后读两个字节

uint16_t read_flash_id(uint8_t command)
{
    uint16_t id = 0;
    uint8_t data[2] = {0};
    SPI_CS = 1;
    SPI_CS = 0;
    
    Write_SPI_Byte(command);
    Write_SPI_Byte(0xFF);
    Write_SPI_Byte(0xFF);    
    Write_SPI_Byte(0x00);
    for(int i = 0; i < 2 ; i++)
    {
        data[i] = Read_SPI_Byte();
        //data++;
    }
    SPI_CS = 1;
    return data[0] >> 8 + data[1];
}

然后读指令我门用刚才提到的0x90:

void main()
{
  InitIO();

  Delay_1s(1);
  SPI_CS = 0;
  read_flash_id(0x90);
}

最后通过逻辑分析仪抓取flash接口可以看到操作ok!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自动驾驶】针对低速无人车的线控底盘技术

目录 术语定义 一般要求 操纵装置 防护等级 识别代号 技术要求 通过性要求 直线行驶稳定性 环境适应性要求 功能安全要求 信息安全要求 故障处理要求 通信接口 在线升级(OTA) 线控驱动 动力性能 驱动控制响应能力 线控制动 行车制动 制动响应能力 线控转向 总体要求 线控…

防火墙技术基础篇:基于NSP配置L2TP VPN

防火墙技术基础篇&#xff1a;基于eNSP配置L2TP VPN 一、L2TP VPN概念 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09;&#xff0c;即第二层隧道协议&#xff0c;是一种基于点对点协议&#xff08;PPP&#xff09;的二层隧道协议。它结合了PPTP&#xff08;Point-t…

Docker的安装、启动和配置镜像加速

前言&#xff1a; Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 而企业部署一般都是采用Linux操作系统&#xff0c;而…

Android关闭硬件加速对PorterDuffXfermode的影响

Android关闭硬件加速对PorterDuffXfermode的影响 跑的版本minSdk33 编译SDK34 import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Port…

Nginx企业级负载均衡:技术详解系列(16)—— Nginx的try_files指令,你知道这个指令是干什么的吗?

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 今天咱们来聊一聊Nginx的try_files指令&#xff0c;你知道这个指令是干什么的吗&#xff1f; 如果你对Web服务器配置有所了解&#xff0c;那么你可能会对try_files指令感到好奇。这个指令实际上是Nginx配置中的一项强…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十四)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 今天&#xff0c;我们来介…

19.4-STM32接收数据-状态显示在屏幕 openMV寻迹与小车控制 Openmv+STM32F103C8T6视觉巡线小车

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 19.4-STM32接收数据-状态显示在屏幕 先通过串口上位机模拟发送、 STM32有视觉循迹模式、…

SwiftUI知识点(一)

前言&#xff1a; Swift知识点&#xff0c;大至看完了&#xff0c;公司项目是Swift语言写的&#xff0c;后续苹果新出的SwiftUI&#xff0c;也需要学习一下 不知觉间&#xff0c;SwiftUI是19年出的&#xff0c;现在24年&#xff0c;5年前的东西了 学习的几个原因&#xff1a; …

探索DIYGW可视化开发工具:提升UniApp项目效率与质量的新途径

一、引言 在快速迭代和不断创新的移动应用开发领域中&#xff0c;开发者们常常面临着一个共同的挑战&#xff1a;如何在保证开发质量的同时&#xff0c;缩短开发周期。近期&#xff0c;一款名为DIYGW的可视化开发工具进入了我们的视野&#xff0c;它以其独特的拖拽式开发方式和…

Linux共享内存创建和删除

最近项目中使用到了共享内存记录下 创建共享内存: 删除共享内存: 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <u…

计算机科技的飞跃:从机械到量子的革命之旅

计算机科技的历史长河中&#xff0c;涌现出了许多划时代的事件和发明&#xff0c;它们不仅标志着技术的飞跃&#xff0c;也深刻地改变了人类生活的方方面面。 ENIAC的诞生 在第二次世界大战的硝烟中&#xff0c;美国军方迫切需要一种能够迅速解决复杂计算问题的工具&#xff0…

深入理解文件系统和日志分析

文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;存储元信息&#xff08;包括文件的属性&#xff0c;权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block&#xff1a;块&#xff0c;连续…

SpringMVC:转发和重定向

1. 请求转发和重定向简介 参考该链接第9点 2. forward 返回下一个资源路径&#xff0c;请求转发固定格式&#xff1a;return "forward:资源路径"如 return "forward:/b" 此时为一次请求返回逻辑视图名称 返回逻辑视图不指定方式时都会默认使用请求转发in…

2024年06月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年06月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

模板-初阶

引言&#xff1a; 在C&#xff0c;我们已经学过了函数重载&#xff0c;这使得同名函数具有多个功能。但是还有一种更省力的方法&#xff1a;采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前&#xff0c;通过一个故事引…

语言模型的校准技术:增强概率评估

​ 使用 DALLE-3 模型生成的图像 目录 一、说明 二、为什么校准对 LLM 模型至关重要 三、校准 LLM 概率的挑战 四、LLM 的高级校准方法 4.1 语言置信度 4.2 增强语言自信的先进技术 4.3 基于自一致性的置信度 4.4 基于 Logit 的方法 五、代理模型或微调方法 5.1 使用代…

Python 网络爬虫:深入解析 Scrapy

大家好&#xff0c;在当今数字化时代&#xff0c;获取和分析网络数据是许多项目的关键步骤。从市场竞争情报到学术研究&#xff0c;网络数据的重要性越来越被人们所认识和重视。然而&#xff0c;手动获取和处理大量的网络数据是一项繁琐且耗时的任务。幸运的是&#xff0c;Pyth…

Winform ListView 嵌入组合框、布尔、图片等复杂控件

一、Winform ListView 显示复杂控件示例 以下展示了两种实现思路方案。最后修改日期 2024-05 surfsky 1.1 方案一&#xff1a;ListView 结合组合框进行模拟编辑 基本思路 在界面上放置一个lisview和一个combobox&#xff0c;combobox平时是隐藏的。点击listview&#xff0c…

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

mysql中基于规则的优化

大家好。我们在平时开发的过程中可能会写一些执行起来十分耗费性能的语句。当MySQL遇到这种sql时会依据一些规则&#xff0c;竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程被称作查询重写&#xff0c;今天我们就来聊一下mysql在查询重写时…