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

    文章

    6087

    浏览量

    35672
收藏 人收藏

    评论

    相关推荐

    tlc2543电压低于3.5V时输出的数就为0了,是什么原因?

    各位专家,我最近使用tlc2543存在一些问题。我才用5V基准源芯片接ref+ gnd接ref- 测量的电压范围是0-4V 但当电压低于3.5V时输出的数就为0了 请问是什么原因 当3.5V-4V之箭时,输出的数跳变不连续 我的pcb已经做好,是否有什么可以替代的芯片 麻烦您了
    发表于 02-13 07:52

    TLC2543接收数据时采集的数据就大范围摆动,怎么解决?

    [list] [*]专家您好,在这里向您咨询一些问题。以下是我的驱动2543的51单片机程序,分开运行采集数据的准确性和稳定性都很好,但是数据经由CAN总线发送,同时处理器也在接收数据时采集的数据
    发表于 02-13 06:38

    TLC2543CD在SPI低速读取时采样电压不对是什么原因导致的?

    SPI程序去读写TLC2543C,出来的电压就不对了,内部的(VREF+ - VREF-)/2输出值应该是800H,但实际输出值为完全不对,下面是时序图。想问一下TLC2543C的应用是否有最低的
    发表于 02-10 06:27

    请问TLC2543未用的模拟输入脚是否可以悬空?

    TLC2543未用的模拟输入脚是否可以悬空?为什么?
    发表于 02-08 08:31

    在调节AD623的5脚电压时,显示的AD数就是调不到1000字?这是为什么?

    TLC2543采集值不对,在基准位2.447V(电压表测出来的),7脚是信号输入,外部信号通过AD623数据放大再输入,在输入为零时,AD623的5脚电压作为输入信号; 在做实验时输入为零
    发表于 01-15 07:44

    TLC2543测电压,收到的数据一直是06 87,为什么?

    测得的数据是12位的,分两个8位数发给串口助手,tlc2543基准电压是5v,待测电压是2v,但是收到的数据一直是06 87,就算改变电压也是一样的;如果单独只发dh或dl,收到的又是07,下面
    发表于 01-10 10:36

    TLC2543的输出结果应为带符号二进制格式的数据,现在输出的结果为不带符号的二进制数,这是因为什么原因?

    DSP采用模拟SPI总线的方式和TLC2543进行通信,采用AIN0,AIN1,AIN2,TLC2543的输出数据格式为16位,高位在前,带符号二进制数。用万用表测的AIN0,AIN1,AIN2
    发表于 12-27 07:46

    请问现在有能替代TLC2543的AD芯片吗?

    请问现在有能替代TLC2543的AD芯片吗?能给推荐一下,最好是贴片焊接。
    发表于 12-13 08:26

    请问TLC2543时序图中“Access Cycle B”中“B”是什么意思?

    TLC2543的I/O CLOCK时序图中,有“Access Cycle B”和“Sample Cycle B”。这里字母“B”是什么意思? 求解答,谢谢各位。
    发表于 12-02 08:07

    使用TLC2543IDB时,输入在2.5V左右,输出数据偶尔会出现错误的5V,为什么?

    我们在使用TLC2543IDB时,输入在2.5V左右,输出数据偶尔会出现错误的5V,出现错误后一直输出5V,重启后可以恢复正常,以下为原理图及配置,请检查有无错误之处,后面付输出波形:(更换为TLC2543IDBRG4Q1后出现问题的频率更高) 更换为
    发表于 11-20 06:49

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 574次阅读

    TLC2543开关电容、逐次逼近型模数转换器数据表

    电子发烧友网站提供《TLC2543开关电容、逐次逼近型模数转换器数据表.pdf》资料免费下载
    发表于 07-31 11:37 2次下载
    <b class='flag-5'>TLC2543</b>开关电容、逐次逼近型模数转换器数据表

    TLC2543-EP模数转换器(ADC)数据表

    电子发烧友网站提供《TLC2543-EP模数转换器(ADC)数据表.pdf》资料免费下载
    发表于 07-18 09:26 0次下载
    <b class='flag-5'>TLC2543</b>-EP模数转换器(ADC)数据表

    TLC2543C和TLC2543l开关电容逐次逼近型模数转换器数据表

    电子发烧友网站提供《TLC2543C和TLC2543l开关电容逐次逼近型模数转换器数据表.pdf》资料免费下载
    发表于 07-15 09:30 0次下载
    <b class='flag-5'>TLC2543</b>C和<b class='flag-5'>TLC2543</b>l开关电容逐次逼近型模数转换器数据表

    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>