安霸SPI 剖析

最近在搞单片机和A5S的SPI通信

1、A5S是跑的是ITRON的系统、有自己相关的SPI API函数
2、单片机这边也是可以熟悉了,发送,接收什么的,我都可以自模拟出来
3、但是问题是,A5S上面的API函数的工作是如何的,我一直没怎么弄清楚
4、一般的SPI通信,不都是主机提供时钟信号吗?可是我用A5S发送数据的时候,用示波器量时钟引脚,并没有看到有方波
5、不知所解呀

最后发现,在CSDN上发帖子,发完之后总是不记得自己有发过,而且不知道在哪里找回来,最后面自己搜索出来了
http://bbs.csdn.net/topics/390437622?page=1#post-394425594

//==================================================================================================================================
今天在我的系统上验证了那几个API函数、发关的时候我用示波器去查看,MOSI引脚,发现有输出、这让我感到非常的高兴,然后再用示波器去测了一下SCL引脚,发现SCL引脚竟然是低电平,一点反应都没有,查了一下资料,有些资料上写着,SPI发送的时候应该会进行如下几个步骤、
1、首先初始化一些什么寄存器呀,设置是发送多少位什么的,还有设置是低位先发送还是高位先发送
2、然后把数据填写到发送的buffer里面去
3、发送buffer里面的数据把数据一位一位的移到MOSI上面去、实际上就是一个移位寄存器的原理
4、发送完成

后面我再测了一下EN脚,发现EN脚一直都是高电平、不过这里可以理解,可以理解成高电平使能发送
还有,我用串口打印了一下发送的那个API函数,返回的值是0,说明是这个函数已经成功执行了。
如果是这样的话,那我从机要如何接收呢?主机没有发送时钟信号,没有时钟信号是如何发送的,然后从
机要如何搞,真的是太不可理解了


#define MCU_SPI_EN 		GPIO(91)
#define MCU_SPI_MISO	GPIO(90)
#define MCU_SPI_MOSI 	GPIO(89)
#define MCU_SPI_SCL		GPIO(88)#define MCU_SPI_ID 			1	
#define MCU_SPI_MODE		SPI_MODE3
#define MCU_SPI_DFS			0x8    //full-duplex
#define MCU_SPI_BAUD_RATE	500000    //500000void rtc_mcu_spi_init(void)
{printk("---------rtc_mcu_spi_init--------------\n");#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endifspi2_config(0, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 0, SPI_CS_POL_HIGH);
}void rtc_mcu_spi_handler(int eid)
{u16 reg[2];u16 ID=0xAAAA;unsigned char Flag=0;//reg[0]=0xaa55;//reg[1]=0xaa55;//Flag=spi2_write(MCU_SPI_ID, reg, 2);Flag=spi2_write_read(MCU_SPI_ID, &ID, reg ,1, 2);printk("======reg[0]-reg[1]===========:%x, %x\n",reg[0],reg[1]);if(Flag==0){printk("a5sspi_write_success----------\n");}else{printk("a5sspi_write_fail-------------\n");}
}

之前用示波器查看那四个引脚,老是有问题,今天借了另一块板子来试了一下才知道,原来是我的板子有问题,现此对安霸公司说声抱歉,你们的系统还是可以用的
片选 线没有波形,时钟线的数据线有波形、后面我做了如下的修正,可以用示波器看到片选信号的波形了

#define MCU_SPI_EN 		GPIO(91)
#define MCU_SPI_MISO	GPIO(90)
#define MCU_SPI_MOSI 	GPIO(89)
#define MCU_SPI_SCL		GPIO(88)#define MCU_SPI_ID 			0	//spi2_config 对应的是SPI的第二个接口了,但是SPI的第二个接口只能接一个SPI从设备,所以把这里改为0,而不是1#define MCU_SPI_MODE		SPI_MODE0
#define MCU_SPI_DFS			0x77 //0x8    //full-duplex
#define MCU_SPI_BAUD_RATE	50000    //500000void rtc_mcu_spi_init(void)
{printk("---------rtc_mcu_spi_init--------------\n");#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endif//gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_OUTPUT);//gpio_set(MCU_SPI_EN);spi2_config(MCU_SPI_ID, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 1, 0);
}void rtc_mcu_spi_handler(int eid)
{u16 reg[2];u16 ID=0x0AB1;unsigned char Flag=1;reg[0]=0xaa55;reg[1]=0xaa55;//gpio_clr(MCU_SPI_EN);//Flag=spi2_write(MCU_SPI_ID, reg, 2);Flag=spi2_write_read(MCU_SPI_ID, &ID, reg ,1, 2);//gpio_set(MCU_SPI_EN);printk("======reg[0]-reg[1]===========:%x, %x\n",reg[0],reg[1]);if(Flag==0){printk("a5sspi_write_success----------\n");}else{printk("a5sspi_write_fail-------------\n");}
}


从这图里看出来,黄色的线就是SPI的片选使能线,我从A5S发送的是write_read的函数,这个函数的话是先写,再读的,所以写和读的中间有一个高电平的脉冲~
我又来了,今天可恶的灰熊拿下了雷霆,不喜欢他是因为他们淘汰了保罗,好了,不说了,说下正事
SPI的全双工工作模式:这里指的是用一个时钟可以完成发送和接收一起的工作,比如8个时钟,可以同时进行发送和接收,因为发送和接收的引脚是不一样的,这里已经进行过验证
下面贴出我今天调试出的通信,先从A5S发命令到单片机,然后单片机判断收到的是不是正确的,再回发消息给A5S,代码如下:
单片机部分:
#ifndef _SPI_
#define _SPI_
//--------------------------------------------------------------
#define	Master_SDO_DAT		_pa5		//DEFINE SDI PIN
#define	Master_SDO_DATC		_pac5		//DEFINE SDI CONTROL BIT#define	Master_SDI_DAT		_pa6		//DEFINE SDI PIN
#define	Master_SDI_DATC		_pac6		//DEFINE SDI CONTROL BIT#define	Master_SCK		_pa7		//DEFINE SDI PIN
#define	Master_SCKC		_pac7		//DEFINE SDI CONTROL BIT#define Master_SPIEN    _pb5       //??SPI?????????
#define Master_SPIENC   _pbc5       //EN?????
//--------------------------------------------------------------void SPI_INIT(void);void MCUSPI_WRITE(unsigned char senddat);unsigned char  MCUSPI_READE(void);#endif


		dat=MCUSPI_READE();if(dat==0x7E){MCUSPI_WRITE(0xa9);}else{MCUSPI_WRITE(dat);}


void SPI_INIT(void)
{//MCU做从机的配置Master_SPIENC=1;Master_SDO_DATC=0;Master_SDO_DAT=0;Master_SDI_DATC=1;Master_SCKC=1;
}
void MCUSPI_WRITE(unsigned char senddat)
{unsigned char i;if(!Master_SPIEN){for(i=0;i<8;i++){				Master_SDO_DAT = senddat&0x80;while(Master_SCK);while(!Master_SCK);	senddat <<= 1;}}
}
unsigned char  MCUSPI_READE(void)
{unsigned char R_Dat;unsigned char i;//循环用到的变量Master_SDO_DAT=0;if(0==Master_SPIEN){for(i=0;i<8;i++){				//if(0==i){ while(!Master_SCK); }				R_Dat |= Master_SDI_DAT;				if(i<7){  while(Master_SCK);  while(!Master_SCK);} R_Dat <<= 1;//接收数据变量 }}return R_Dat;
}


A5S部分:
#define MCU_SPI_EN 		GPIO(91)
#define MCU_SPI_MISO	GPIO(90)
#define MCU_SPI_MOSI 	GPIO(89)
#define MCU_SPI_SCL		GPIO(88)#define MCU_SPI_ID 			0	
#define MCU_SPI_MODE		SPI_MODE0
#define MCU_SPI_DFS			0x77 //0x77//0x8    //full-duplex
#define MCU_SPI_BAUD_RATE	50000    //500000void rtc_mcu_spi_init(void)
{printk("---------rtc_mcu_spi_init--------------\n");#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endif//gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_OUTPUT);//gpio_set(MCU_SPI_EN);spi2_config(MCU_SPI_ID, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 1, 0);
}void rtc_mcu_spi_handler(int eid)
{u8 reg;u8 ID=0x7E;unsigned char Flag=1;Flag=spi2_write_read(MCU_SPI_ID, &ID, ® ,1, 1);printk("======reg[0]-reg[1]===========:%x,\n",reg);if(Flag==0){printk("a5sspi_write_success----------\n");}else{printk("a5sspi_write_fail-------------\n");}
}

	//weiqifartc_mcu_spi_init();app_timer_register(TIMER_1HZ, rtc_mcu_spi_handler);printk("=======mcu_spi==========\n");



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

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

相关文章

河南大学计算机科学与技术中外合作,河南大学中外合作办学怎么样

Q1&#xff1a;河南大学中外合作办学宿舍条件如何&#xff1f;你指的是二本的国际教育学院吗&#xff1f;是老校区最好的&#xff0c;住在学校里面&#xff0c;挨着铁塔公园&#xff0c;有暖气&#xff0c;没有空调&#xff0c;有电扇。四个人一间&#xff0c;上床下桌&#xf…

[AssertionError: nput tensor input format are different]

问题描述 writer.add_image(img/fixed_img, denorm(fixed_img.data), 0)报如下错误 assert(len(tensor.shape) len(input_format)), "size of input tensor and input format are different.AssertionError: size of input tensor and input format are different. tenso…

链表的插入、删除、排序的程序

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node {int data;struct node * pNext; }*pNode,Node; //#define bool int; //#define的意思是单纯的替换&#xff0c;与别名没有关系&#xff0c;而且C语言中没有bool数据类型 type…

linux-2.6.32在mini2440开发板上移植(16)之LED 驱动程序移植

LED 驱动程序移植 编者&#xff1b;对于led的驱动程序&#xff0c;很多文章都有详细的介绍&#xff0c;我的博客里面有一篇专门详解这个的。需要看的&#xff0c;可以找下。led灯的驱动其实就代表了I/O口的驱动。在linux系统下&#xff0c;操作一个I/O口&#xff0c;可以说实在…

单变量批量梯度下降算法与单变量随机梯度下降算法

2.3 代价函数的直观理解I 让我们通过一些例子来获取一些直观的感受&#xff0c;看看代价函数到底是在干什么。 2.4 代价函数的直观理解II 代价函数的样子类似于等高线图&#xff0c;则可以看出在三维空间中存在一个J(θ0,θ1)使得最小的点。 通过这些图形&#xff0c;我希望你…

一台计算机连入计算机网络后通过该计算机,一台计算机连入计算机网络后,该计算机( )。...

摘要&#xff1a;计算机连当碰撞已不可避免时,船舶应根据良好船艺的要求采取最有效的行动以减小碰撞的损失,下列说法正确的是()。①应避免两船首相撞;②应避免一船船首撞入他船机舱附近或船中;③应尽量使两船相撞前相对速度达到最大;④应尽量使两船相撞前相对速度达到最小。算机…

LCD驱动移植(一)

一、种类 LCD的种类比较多,有以下四种,不过现在我们用的大多是TFT液晶显示屏 1、TN型显示器 2、STN型彩色显示器 3、DSTN型显示器 4、TFT显示器 二、LCD参数 (1)尺寸

python调用其他程序或脚本方法(转)

python运行&#xff08;调用&#xff09;其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序&#xff0c;这样就可以在脚本中直接使用其他脚本&#xff0c;或者程序提供的功能&#xff0c;而不必再次编写实现该功能的代码。为了更好地控制运行的进程&#x…

反向传播+代码实现

ywx的反向传播代码实现 import torch x_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]#w是Tensor(张量类型)&#xff0c;Tensor中包含data和grad&#xff0c;data和grad也是Tensor。 # grad初始为None&#xff0c;调用l.backward()方法后w.grad为Tensor&#xff0c; # 故更…

考研专业课计算机网络调剂,计算机网络信息中心2019年硕士研究生接收调剂信息公告...

一、外单位考生调剂1.接收调剂要求报考学科门类 政治理论 外国语 业务课一 业务课二 总分工学(08) 同国家复试分数线基本要求 325工程(0852) 同国家复试分数线基本要求 325中心调剂指标预计在4人左右&#xff0c;均为计算机技术专业。2.调剂流程1、3月26日14&#xff1a;00至3月…

linux目录树(书本上看到)

LINUX的目录树 /bin bin 是binary 的缩写。这个目录是对UNIX 系统习惯的沿袭,存放着使用者最经常使用的命令。例如:cp,ls,cat。 /boot 这里存放的是启动LINUX 时使用的一些核心文件。 /dev dev 是device(设备)的缩写。这个目录下是所有LINUX 的外部设备,其功能类似DOS 下的.…

Collection中Set集合在应用中常见的方法和注意点

Set集合 &#xff1a; 元素无序的&#xff0c;元素不允许重复。 ---->HashSet : 存值方式使用哈希表来存值的。 原理 &#xff1a; 如果HashSet中存放对象 ,首先会调用对象的hashCode方法获取到哈希值&#xff0c;通过哈希值做移为等运算&#xff…

【Pytorch神经网络实战案例】04 使用Pytorch实现线性回归

import torchx_data torch.tensor([[1.0],[2.0],[3.0]]) y_datatorch.tensor([[2.0],[4.0],[6.0]])#重点在于构造计算图 pytorch会自动计算梯度 #Zwxb 就是一个线性单元class LinearModel(torch.nn.Module):#Module的对象会自动实现backword()的过程#构造函数def __init__(self…

html 网页制作标签,html网页制作标签最全版.doc

html网页制作标签最全版MetaName(页面描述信息)keywords。关键字&#xff0c;格式&#xff1a;description。描述&#xff0c;格式&#xff1a;author。 作者&#xff0c;格式&#xff1a;generator。编写工具&#xff0c;格式&#xff1a;robots。 机器人&#xff0c;格式&…

menu菜单

[1]添加菜单方式 通过一个布局 在res下 meun目录下创建一个布局 <menu xmlns:android"http://schemas.android.com/apk/res/android" ><itemandroid:id"id/action_settings1"android:orderInCategory"10"android:title"hahah"…

计算机网络阅读报告,计算机网络实验二报告

计算机网络实验二报告 (5页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分&#xfeff;计算机网络实验报告课程_ 计算机网络 _ 实验名称 TCP/IP协议分析与验证 姓 名 实 验 日 期&#xff…

LCD驱动移植(二)

LCD驱动的话会在MINI2440里是向Plaform注册的一个驱动 Plaform的话可以在网上查查这方面的资料&#xff0c;主要要注意这两个函数&#xff0c;如下&#xff1a; (1)platform_device_register()注册平台XX设备。 (2)platform_driver_register()注册平台XX驱动。 下面贴出LCD驱…

使用Pytorch处理多维特征的输入

下图这个预测一个人在一年之后得糖尿病的概率的例子&#xff0c;这个时候我们的输入将会有很多的指标。你可以把它看成是我们体检的各种值。最后一排的外代表了他是否会得糖尿病。 那么多维的特征输入应该怎么办呢&#xff1f;我们就需要把每一个特征x付以相应的权重。在进行逻…

dubbo学习 三 dubbox概述

当当网根据自身的需求&#xff0c;对dubbo进行了扩展就叫成了dubbox。具体的使用方法可以参照官网各种例子&#xff1a;http://dangdangdotcom.github.io/dubbox/ 支持rest风格远程调用 之前了解过restful服务具体是什么&#xff0c;resteasy也了解过&#xff0c;所以看到就可以…

非大学生学计算机,浅谈非计算机专业大学生的计算机教学

第 卷 年 月黑 龙 江 科 学浅谈非计 算机 专业 大学生的计算机教 学曾 宇(辽源职业技术学院医药分院 &#xff0c;吉林 辽源 )摘 要 &#xff1a;为了提高大学生计算机应用能力 &#xff0c;适应社会及用人单位的需求 &#xff0c;对 非计算机专业大学生的计 算机教学提 出了更…