TQ2440 GPIO模拟SPI读取AD转换器TLC2543芯片
其实接触CSDN好久了,一直没有想写自己的博客,遇到问题的时候才去上CSDN参考别人的资料,想到以后不能脚踩西瓜皮,滑倒哪里是哪里,要一个萝卜一个坑,用CSDN博客记录下自己的每一个脚印,一来自己以后可以回过来温故知新,二来很高兴为后来人做一个可参考的基石。毕设了,打算用MDK去开发TQ2440,题目是单片机的液压控制系统,其中,会用到TLC2543芯片的AD转换器,TLC2543是12位精度的SPI接口的AD芯片,起初用网上便宜的8位AD芯片PCF8591,好不容易用TQ2440自带的IIC总线调通了AD的读取,老师说精度太低,换!这不,我就选取了TLC2543芯片,原以为调试SPI和IIC一样简单,谁知道,真正调试的时候,遇到各种问题,首先采用的是SPI查询方式,读取的数据一直不确定,检查电路无误之后,上网查遍了S3C2440读取TLC2543的资料,发现资料太少了,唯一可参考的是一位西安交大毕设论文,描述的是linux下的S3C2440的TLC2543读取的驱动的编写。发现了一些错误,但是论文写的遮遮掩掩,并不完全透明。无奈之下,我放弃了SPI接口的编写,网上更多的GPIO模拟的驱动,我搜索了一下,S3C2440的SPI模拟的程序还真没有人写过,我就在此记录一下了。
#include "2440addr.h"
#include "AD.h"#define CLK(value) (rGPGDAT = (rGPGDAT & ~(1<<11)) | (value<<11)) //CLK
#define DOUT(value) (rGPGDAT = (rGPGDAT & ~(1<<7)) | (value<<7)) //MOSI
#define AD_CS(value) (rGPGDAT = (rGPGDAT & ~(1<<10)) | (value<<10)) //AD_CS/************AD的初始化程序************************** GPG11-----CLK GPG7----MOSI GPG10-----AD_CS GPG1-----MISOGPG3----ECO
******************************************************/
void AD_Init(void)
{rGPGCON&=(~((3<<2)|(3<<14)|(3<<20)|(3<<22)|(3<<6))); rGPGCON|=(0<<2)|(1<<14)|(1<<20)|(1<<22)|(0<<6); //GPG7,10,11设置成输出,GPG1设置成输入 rGPGUP&=(~((1<<1)|(1<<7)|(1<<10)|(1<<11)|(1<<3))); //只使能GPG1,7,10,11的上拉,做基本IO口
}void delay_AD(unsigned int N)
{
while(N--);
} unsigned short Read_AD(unsigned char ADchannel)
{unsigned int i;unsigned short ADC=0; ADchannel<<=4; //XXXX 0000,按照格式要求 ,12bits,MSB先入while(!(rGPGDAT&0x0008)); //GPG3----ECO如果是低电平,继续,这里一定要加上,不然可能会出现极大的跳变的现象CLK(0); AD_CS(0); for(i=0;i<12;i++){ if(rGPGDAT&0x0002) ADC|=0x0001;//判断接收GPG1的是否为1 if(ADchannel&0x80) DOUT(1); //向AD发送数据else DOUT(0);CLK(1); delay_AD(30); CLK(0); delay_AD(30);ADchannel<<=1;ADC<<=1; }AD_CS(1);ADC>>=1;return ADC; //12位精度
}
1.上面的程序是参考51的一个例程仿写的,但是51上没有EOC的反馈的连接,我刚开始也没有接,但是读取的数据一直在0和读取数据之间跳变,而且有时候读取的数据还挺奇怪一直怀疑是时序的同步问题,所以我后来加上了EOC的连接,顺利解决的此事,读取数据还算比较稳定。
TQ2440 GPIO模拟SPI读取AD转换器TLC2543芯片相关推荐
- 用GPIO模拟SPI接口读取传感器数据
本文基于平头哥开发板RVB2601,简要介绍了用GPIO模拟SPI时序逻辑,实现SPI协议,按照特定温度传感器的时序,读取其数据,及示例程序 一.概述 SPI(Serial Peripheral In ...
- GPIO模拟SPI通讯接口
一.SPI总述 SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换.也就是说,SPI是一种规定好的通讯方式.这种通信方式的优点是占用端口较少,一般4根就够基本通讯了.同时 ...
- 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341
[全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...
- 外设驱动库开发笔记43:GPIO模拟SPI驱动
SPI总线是我们常用的串行设备接口,一般情况下我们都会适应硬件SPI接口,但有些时候当硬件端口不足时,我们也希望可以使用软件来模拟SPI硬件接口,特别是要求不是很高的时候.在这一篇中我们将来讨论如 ...
- SPI总线协议、SPI时序图详解、GPIO模拟SPI
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...
- 12位串行AD转换器TLC2543与单片机的接口设计与编程
第一次做光学仪器的小项目中的一部分是数据采集后经过模数转换,把采集到的电压用数字量输入到单片机中进行处理.此处总结下TLC2543的相关资料和与单片机接口方面的编程.主要的参考资料是TLC2543的d ...
- stm32使用gpio模拟spi
本文介绍如何使用STM32标准外设库的GPIO端口模拟SPI,本例程使用PA5.PA6和PA7模拟一路SPI.SPI有4种工作模式,模拟SPI使用模式0,即空闲时SCK为低电平,在奇数边沿采样. 本文 ...
- 在ARM Linux下使用GPIO模拟SPI时序详解
Author:杨正 Data:2016.1.1 Mail:yz2012ww@gmail.com 一. 概述 SPI是英文SerialPeripheral Interface的缩写,顾名 ...
- c语言编程TLC2543AD采集,AD转换器TLC2543编程
一.特性 (1)12位分辨率A/D转换器: (2)在工作温度范围内10μs转换时间: (3)11个模拟输入通道: (4)3路内置自测试方式: (5)采样率为66kbps: (6)线性误差+1LSB(m ...
最新文章
- websocket 群/单聊 基础
- android 在debug的时候不会出现闪退问题 在debug时无法重现bug 的可能原因
- 阿里云 apt-get update 403
- python中的序列总结:列表,元组,字符串
- BZOJ2815: [ZJOI2012]灾难
- GDCM:gdcm代码中引发bad_alloc异常测试程序
- html 页面工具,html页面工具-htmlUnit
- php swoole process,PHP swoole的process模块创建和使用子进程操作示例
- python的for语句要用冒号吗_python中循环的写法 for
- SQL Serever学习4
- vmlinux_32.lds.S
- 如果有一天,程序员不想做程序了,首选要做什么呢?
- SCVMM 2012 R2---添加Hyper-V虚拟机
- 戴尔计算机软件的安装,戴尔笔记本电脑安装软件没反应怎么办
- 自适应直方图均衡化matlab 程序,直方图均衡化程序 matlab
- OSChina 周四乱弹 ——丑到端水水更流,举杯浇丑丑更丑
- 【爬虫实战】国家企业公示网-项目分析
- 大数据、物联网、云计算
- 亚马逊测评自养号,小白应该如何开始?
- [IOS APP]小豆子幽默丛书