0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术EM9280主板SPI访问TLC2543 AD示例

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-17 08:58 次阅读

英创EM9280工控主板带有半双工的硬件SPI,与SPI协议的芯片通信时比使用GPIO模拟时序更加简单方便。本文以TLC2543芯片为例,介绍如何使用SPI获得芯片的AD数据。也为客户使用SPI驱动与其它型号芯片通信提供参考。

TLC2543芯片简介

TLC2543是德州仪器公司生产的12位开关电容型逐次逼近模数转换器,有11路AD输入。参考芯片手册资料,TLC2543支持8bit,12bit,16bit 的SPI协议,EM9280可以使用8bit和16bit的SPI与TLC2543通信。TLC2543是12位的AD,所以8bit会省略4位数据,而16bit会添加4位软件模拟数据。本文只介绍16bit的使用方法。

参考芯片数据手册。

上图为TLC2543 16bit的时序图,我们可以设置SPI为16bit,数据长度1字节来访问。

TLC2543发送数据定义,例如需要访问AIN6,即D7-D4为0110。读取数据采用单极性,MSB first,8bit,即D3-D0为0100。那么发送的1字节数据就为b0110 0100,即0x64。

因为EM9280的SPI为半双工,第一次16bit发送数据,第二次16bit读入数据。

资料说明TLC2543为12位AD。当使用16bit模式时会返回16位的数据,低4位为无效0。我们可以通过移位,处理为12位的数据

C#程序代码

参考EM9280光盘目录C# SPI例程,对照TLC2543芯片资料,修改相关参数设置。16bit本来应该使用short(2字节)数组进行操作,但是C#的Marshal.Copy只能操作byte数组,所以需要用byte数组来代替short数组,同时2位byte表示1位short。

比如:希望传送short[0] = 0x0c00;那么就设置byte[0] = 0x00;byte[1] = 0x0c;

同样在最后解析数据的时候,byte[0] = 0xc0;byte[1] = 0x6c;那么转换后便是short[0] = 0x6cc0;

先定义SPI为16bit,在SPI.cs中定义

private const int SSP_WORD_LENGTH_16BITS = 0xF;

在SPIConfigure函数中定义

spiinit.eLength = SSP_WORD_LENGTH_16BITS;

执行代码


//spi初始化代码---------------------------------
SPI.SPISetBandRate(hSPI, 2000000); //设置频率2MHz
//spi发送---------------------------------------
i = 0; //读取AIN0
//16bit
TxBuffer[0] = 0;
TxBuffer[1] = (byte)((i << 4) + 0x0c); //i左移4位到D7-D4,后面0x04为D3-D0 
sSPI.BitCount = 16; //设置为16bit
sSPI.pDatBuf = pTxBuffer;
sSPI.dwDatLen = 1; //设置数据1字节
sSPI.bLockCS = 0; //0为发送
Marshal.Copy(TxBuffer, 0, pTxBuffer, 10);
bRes = SPI.WriteFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0);
//spi接收---------------------------------------
sSPI.BitCount = 16;
sSPI.pDatBuf = pRxBuffer;
sSPI.dwDatLen = 10;
sSPI.bLockCS = 1;
bRes = SPI.ReadFile(hSPI, ref sSPI, sizeSPI, ref uLen, 0);
Marshal.Copy(pRxBuffer, RxBuffer, 0, 10);
int AIN = RxBuffer[0] + RxBuffer[1]*256; //读得数据

测试结果

AIN = AIN / 16; //右移4位,舍弃后4位软件模拟数据
Double dAIN = (double)AIN / 4096.0 * 4.86;

这里读得AIN为0x6cc0,右移动4位为0x06cc,为12位AD数据,所以除以2^12即4096,再乘上基准电压(用万用表测得4.86V),结果为2.064V,用万用表量得结果,几乎是一样的。

C程序代码

参考EM9280光盘目录C SPI例程,对照TLC2543芯片资料,修改相关参数设置。

先定义SPI为16bit

#define UseBitCount16 1 //修改该定义为或,实现位数据位或位数据位通讯
#if UseBitCount16
#define dBitCount 16
#else
#define dBitCount 8
#endif

定义BUFFER为16字节数组
WORD SPI_TxBuf[10],SPI_RxBuf[10];

执行代码


//spi初始化代码---------------------------------
SPISetBandRate( hSPI , 2000000); //设置频率2MHz
//spi发送---------------------------------------
i = 0; //读取AIN0
SPI_TxBuf[0]= ((i << 4) + 0x0c)<<8; //i左移位到D7-D4,后面x0c为D3-D0,最后要左移8位,因为协议里16位前8位有效 
hSPI_Box.BitCount = dBitCount; //设置为8bit
hSPI_Box.bLockCS = 0; //0为发送
hSPI_Box.dwDatLen = 1; //设置数据1字节
hSPI_Box.pDatBuf = (BYTE*)SPI_TxBuf;
WriteFile( hSPI , &hSPI_Box , sizeof( hSPI_Box ) , (DWORD*)&i , 0 );
//spi接收---------------------------------------
hSPI_Box.bLockCS = 1;
hSPI_Box.dwDatLen = 1;
hSPI_Box.pDatBuf = (BYTE*)SPI_RxBuf;
ReadFile( hSPI , &hSPI_Box , sizeof( hSPI_Box ) , (DWORD*)&i , 0 );

测试结果
f=(double)(SPI_RxBuf[0]>>4)/4096.0*4.86 ;
这里读得SPI_RxBuf[0]为0x6ca0,右移动4位为0x06ca,为12位AD数据,所以除以2^12即4096,再乘上基准电压(用万用表测得4.86V),结果为2.062V,用万用表量得结果,几乎是一样的。

详细SPI例程代码见光盘SPI例程,相关问题,客户可以联系英创工程师咨询。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34635
收藏 人收藏

    评论

    相关推荐

    亿道信息新三防平板EM-I10J,性能和价格成最大亮点

    亿道信息近期推出了一款新三防平板电脑名为EM-I10J,这款设备上市的初衷是为了在满足客户作业需求的同时为其提供更合适的价格选择,但这并不意味着EM-I10J的实力可以被小觑。
    的头像 发表于 02-28 10:54 142次阅读

    RX78M组 EtherCAT ETG.5003示例程序固件信息技术

    电子发烧友网站提供《RX78M组 EtherCAT ETG.5003示例程序固件信息技术.pdf》资料免费下载
    发表于 02-21 14:22 1次下载
    RX78M组  EtherCAT ETG.5003<b class='flag-5'>示例</b>程序固件<b class='flag-5'>信息技术</b>

    关于AD9280非线性的问题求解

    我有一块用ad9280做ad转换的板子,采用的是内部2V参考电压的设计,输入信号范围是0~2V。 然后我发现直流的时候有问题: Ain=1000mV的时候,输出0111_1111 Ain
    发表于 12-13 06:02

    AD5676:Octal,16-Bit <em>nunano </em>DAC,带有SPI界面数据表 ADI

    电子发烧友网为你提供ADI(ADI)AD5676:Octal,16-Bit nunano DAC,带有SPI界面数据表相关产品参数、数据手册,更有
    发表于 10-08 16:36
    AD5676:Octal,16-Bit <<b class='flag-5'>em</b>>nunano </<b class='flag-5'>em</b>>DAC,带有<b class='flag-5'>SPI</b>界面数据表 ADI

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    如何使用USB MSD访问SPI闪存文件

    应用程序:该代码演示了如何使用 USB MSD 访问 SPI 闪存文件 。 BSP 版本: NUC230-240 Series BSP CMSIS v3.01.001 硬件
    发表于 08-30 07:15

    使用GPIO实现基于MS51系列的TLC2543读写时间序列

    应用:本样本代码读取以MS51系列为基础的TLC2543A/D转换数据。 BSP版本:MS51系列BSP Keil V1.00.002 硬件:NuTiny-MS51FB V1.1 TLC2543
    发表于 08-23 07:17

    如何使用USB MSD访问SPI闪存文件?

    应用程序:该代码演示了如何使用 USB MSD 访问 SPI 闪存文件 。 BSP 版本: NUC230-240 Series BSP CMSIS v3.01.001 硬件
    发表于 08-22 06:43

    博途PLC示例: 间接寻址的示例简析

    在以下示例中,可以使用下标访问来自不同存储区的三个变量。
    的头像 发表于 08-17 17:21 2862次阅读
    博途PLC<b class='flag-5'>示例</b>: 间接寻址的<b class='flag-5'>示例</b>简析

    MAX9280GTN/V+WGG6 - (Maxim Integrated) - 接口 - 串行器,解串器

    电子发烧友网为你提供Maxim(Maxim)MAX9280GTN/V+WGG6相关产品参数、数据手册,更有MAX9280GTN/V+WGG6的引脚图、接线图、封装手册、中文资料、英文资料
    发表于 08-04 18:48
    MAX<b class='flag-5'>9280</b>GTN/V+WGG6 - (Maxim Integrated) - 接口 - 串行器,解串器

    MAX9280AGTN+ - (Maxim Integrated) - 接口 - 串行器,解串器

    电子发烧友网为你提供Maxim(Maxim)MAX9280AGTN+相关产品参数、数据手册,更有MAX9280AGTN+的引脚图、接线图、封装手册、中文资料、英文资料,MAX9280AGTN+真值表,MAX
    发表于 08-03 18:38
    MAX<b class='flag-5'>9280</b>AGTN+ - (Maxim Integrated) - 接口 - 串行器,解串器

    MAX9280AGTN+T - (Maxim Integrated) - 接口 - 串行器,解串器

    电子发烧友网为你提供Maxim(Maxim)MAX9280AGTN+T相关产品参数、数据手册,更有MAX9280AGTN+T的引脚图、接线图、封装手册、中文资料、英文资料,MAX9280AGTN+T真值表,MAX
    发表于 08-03 18:35
    MAX<b class='flag-5'>9280</b>AGTN+T - (Maxim Integrated) - 接口 - 串行器,解串器

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49

    求分享使用DMA进行SPI Master传输的示例

    SPI 通信的示例,并且设置不像其他工具箱那样简单,只需选中 DMA 选项即可激活它。 您能否与我分享一个使用 DMA 进行 SPI Master 传输的示例
    发表于 05-30 09:42

    权威榜单发布!“2022-2023信息技术应用创新榜”隆重揭晓

    2023年5月8日,由信息化观察网、信息技术应用创新榜组委会组织发起的“2022-2023信息技术应用创新榜”评审结果正式公示。本次榜单征集旨在全面展示信创发展最新成果,遴选出信创细分领域创新
    的头像 发表于 05-09 09:40 862次阅读