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

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

3天内不再提示

如何在MAXQ3180微控制器上使用串行外设接口

星星科技指导员 来源:ADI 作者:ADI 2023-01-16 09:30 次阅读

MAXQ3180微控制器为电表的多相模拟前端。它集成了现代多功能电能计量所需的所有功能。MAXQ3180通过串行外设接口(SPI™)总线将其读数传送给主机微控制器。本应用笔记描述了该接口是如何完成的,并提供了示例代码,以帮助设计人员实现通信机制。

SPI概述

串行外设接口 (SPI) 是一种设备间总线协议,可在芯片之间提供快速、同步、全双工通信。一个器件(主设备)驱动同步时钟,并选择多个从站中的哪一个被寻址。每个SPI外设由一个移位寄存器控制电路组成,因此寻址串行外设接口SPI外设同时发送和接收。

pYYBAGPEqLOADbrlAAALt5HL6dM046.gif?imgver=1

图1.SPI 从站的插图。

SPI通信中使用了四种分立电路:

SCLK:所有设备使用的同步时钟。主站驱动此时钟,从设备接收时钟。请注意,SCLK 可以门控,不需要在 SPI 事务之间驱动。

莫西:主人出来,奴隶进来。这是由主站驱动到SPI总线上所有从机的主数据线。只有选定的从站时钟从MOSI数据。

MISO:主人进,奴出。这是由选定的从站驱动到主站的主数据线。只有选定的从机可以驱动该电路。事实上,它是SPI总线布置中唯一允许从站驱动的电路。

SSEL:信号对于每个从站都是唯一的。当活动(通常为低电平)时,所选从机必须驱动MISO。

对于此讨论,必须注意SPI外设同时发送和接收。想到这一点的一个方便方法是,主站总是发送一个字节并接收一个字节。

一些SPI外设牺牲了速度,转而模拟半双工操作。 MAXQ3180微控制器不是这种情况,它是一款真正的全双工SPI从机。

本应用笔记的其余部分介绍如何在SPI总线上连接并成功使用MAXQ3180。

MAXQ3180通信概述

对于主机(即主机)来说,MAXQ3180看起来像一个由RAMROM组成的存储器阵列。这是因为MAXQ3180中的ROM固件从RAM读取其工作参数,并将结果放在RAM中。因此,配置MAXQ3180就像对其RAM位置进行块写入一样简单。

一些MAXQ3180“存储器”位置触发器件内的动作,以“动态”计算电能计量结果。写入这些位置是“nop”。RAM 和虚拟 ROM 位置的具体功能和用途超出了本文档的范围。这里重要的事实是,微控制器实际上只有两种SPI通信操作:读取和写入。

MAXQ3180中的每个事务都从主站发送两个字节开始,其中包含命令(即读或写)、访问地址和访问字节数。如上所述,每个SPI外设每接收一个字节返回一个字节。因此,MAXQ3180在接收到第一个命令字节后返回0xC1,在第二个命令字节后返回0xC2。该协议如图 2 所示。

poYBAGPEqLSAYqrGAAAwptij4N4910.gif?imgver=1

图2.主机向MAXQ3180读写数据。

如果主服务器正在读取一个或多个字节,则必须发送虚拟字节。请记住,除非从站发送一些东西,否则主站无法从从站接收任何东西:发送一个字节来获取一个字节。但是在收到命令后,MAXQ3180可能必须计算结果,因此当主机发送虚拟字节时可能还没有准备好结果。因此,MAXQ3180在发送数据之前,总是发送零个或多个NAK字符(0x4E或ASCII'N'),后跟ACK字符(0x41或ASCII'A')。

如果主站正在写入一个或多个字节,它会在发送命令后立即发送要写入的数据。MAXQ3180为每个数据字节返回ACK (0x41)。然后,它返回 NAK (0x4E),直到写入周期完成,之后返回最终的 ACK。

注意,在最终ACK之后,MAXQ3180立即准备好开始下一笔交易;它不需要等待任何其他事件。甚至不需要切换 SSEL 即可开始下一个事务。MAXQ3180知道第一笔交易已经结束,并准备好进行下一笔交易。

无论出于何种原因,如果需要复位主机与MAXQ3180之间的通信(例如,如果通信变得不同步),主机只需等待200ms即可从第一个命令字节重新启动通信。200ms延迟通知MAXQ3180主机放弃前一个事务。

命令字节

命令字节告诉MAXQ3180:

请求的事务是读取还是写入

交易的长度

RAM 中要修改的地址(或要读取的虚拟 ROM 地址)

pYYBAGPEqQ-AcxYOAAApGbsOs8s736.png

图3.命令字节的结构。

第一个命令字节(图3)告诉MAXQ3180所请求的事务是读还是写,以及事务的长度。命令字节使用以下计划:

长度代码 数据长度
0b00 1 字节
0b01 2 字节
0b10 4 字节
0b11 8 字节

命令字节 1 的其余部分和所有命令字节 2 提供要访问的 RAM 中字节的地址(或虚拟 ROM 函数的身份)。

主机软件设计

虽然MAXQ3180包含硬件SPI控制器,但单个消息字节仍由ROM固件中的软件例程处理。因此,连续字节之间需要延迟。在当前版本的MAXQ3180中,该延迟必须不小于100μs才能可靠工作。参见图 4 和图 5。

pYYBAGPEqTeAQTw5AABtQz9C5AI196.png

图4.MAXQ3180读数流程图

poYBAGPEqS-ADGFIAABzQeE9TdI866.png

图5.编写MAXQ3180的流程图

代码清单

提供代码,用于将内置SPI主机的MAXQ2000微控制器连接至MAXQ3180。其他微控制器的用户将需要提供自己的SPI基元,并可能修改高级子程序。

在下面的列表中,子例程导致程序线程在给定的微秒数内停止执行。常量被定义为提供比字符超时更长的内容。dly_usSPI_TIMEOUT

在高级子例程中,ENUM 用于按名称选择寄存器。它索引数组,其中包括每个MAXQ3180寄存器的寄存器长度。请参见图 6、7 和 8。register_lookup_table

unsigned char Send_SPI(unsigned char x)
{
  unsigned char y = 0;
  int z;
  int error = 0;
  SPICN = 3; /* MSTSM, SPIEN */
  z = 0; while ((SPICN_bit.STBY) && (++z < SPI_TIMEOUT));
  if (z == SPI_TIMEOUT) error = 1;
  SPICN_bit.SPIC = 0; /* Clear transfer complete flag */
  SPIB = x;
  z = 0; while ((!SPICN_bit.SPIC) && (++z < SPI_TIMEOUT));
  if (z == SPI_TIMEOUT) error = 1;
  y = SPIB;
  SPICN_bit.SPIC = 0;
  dly_us(100);
  if (error) return 0;
  return y;
}

图6.基元的代码。Send_SPI

long Read_AFE(enum METER_REGISTER_RECORD reg, uint16 reg_addr)
{
  extern unsigned char record[8];
  unsigned long x = 0;
  unsigned char i, regadd, command_code = 0;
  for(i=0; i<8; i++) record[i] = 0;
  switch(register_lookup_table[reg].register_length)
  {
  case 2: command_code |= 0x10; break;
  case 4: command_code |= 0x20; break;
  case 8: command_code |= 0x30; break;
  }
  command_code |= reg_addr >> 8;
  regadd = reg_addr & 0xff;

  /* Disable SPI to reset it */
  SPICN_bit.SPIEN = 0;
  for(x=0; x<300; x++);
  SPICN_bit.SPIEN = 1;

  SPI_SELECT_0;
  i = 0;
  while((Send_SPI(command_code)!= 0xC1)&&(++i < SPI_COMMAND_RETRIES))
    spi_comm_timeout();

  x = 0xffffffff;
  if (i == SPI_COMMAND_RETRIES) goto spierror;
  Send_SPI(regadd);
  i = 0; while((Send_SPI(0) != 'A') && (++i < SPI_RETRIES));
  if (i == SPI_RETRIES) goto spierror;
  x = 0;
  for(i=0; i
			

图7.() 子例程的代码。ReadAFESPI_Read

long Read_AFE(enum METER_REGISTER_RECORD reg, uint16 reg_addr)
{
  extern unsigned char record[8];
  unsigned long x = 0;
  unsigned char i, regadd, command_code = 0;
  for(i=0; i<8; i++) record[i] = 0;
  switch(register_lookup_table[reg].register_length)
  {
  case 2: command_code |= 0x10; break;
  case 4: command_code |= 0x20; break;
  case 8: command_code |= 0x30; break;
  }
  command_code |= reg_addr >> 8;
  regadd = reg_addr & 0xff;

  /* Disable SPI to reset it */
  SPICN_bit.SPIEN = 0;
  for(x=0; x<300; x++);
  SPICN_bit.SPIEN = 1;

  SPI_SELECT_0;
  i = 0;
  while((Send_SPI(command_code)!= 0xC1)&&(++i < SPI_COMMAND_RETRIES))
    spi_comm_timeout();

  x = 0xffffffff;
  if (i == SPI_COMMAND_RETRIES) goto spierror;
  Send_SPI(regadd);
  i = 0; while((Send_SPI(0) != 'A') && (++i < SPI_RETRIES));
  if (i == SPI_RETRIES) goto spierror;
  x = 0;
  for(i=0; i
			

图8.() 子例程的代码。Write_AFESPI_Write

审核编辑:郭婷

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

    关注

    48

    文章

    6812

    浏览量

    147653
  • 芯片
    +关注

    关注

    447

    文章

    47804

    浏览量

    409174
  • 接口
    +关注

    关注

    33

    文章

    7640

    浏览量

    148512
收藏 人收藏

    评论

    相关推荐

    带红外模块的16位微控制器MAXQ61C电子资料

    概述:MAXQ61C是一款低功耗、16位MAXQ 微控制器 ,设计用于通用遥控 、消费类电子和白色家电等低功耗产品。器件结合了功能强大的16位RISC
    发表于 04-13 07:16

    16位微控制器MAXQ613电子资料

    概述:MAXQ613是一款低功耗、16位MAXQ 微控制器 ,设计用于通用 遥控 、消费类 电子 和白色家电等低功耗产品。器件结合了强大的16位RISC
    发表于 04-13 07:35

    MAX3180/MAXQ3180中文资料pdf

    MAXQ3180是专用的电气参数测量前端,它采集并计算多相负载的多相电压、电流、功率、能量等多种计量参数和功率品质参数。外部主机通过片内串行外设接口(SPI™)总线读出计算
    发表于 06-30 11:41 124次下载

    MAXQ3180 Low-Power, Multifunct

    The MAXQ3180 is a dedicated electricity measurement front-end that collects and calculates
    发表于 02-06 12:44 26次下载

    如何使用MAXQ3180的低功耗测量模式与停止模式

    如何使用MAXQ3180的低功耗测量模式与停止模式:1. MAXQ3180 的多种工作模式......................................... 22. MAXQ3180
    发表于 10-31 07:58 16次下载

    怎样使用MAXQ3180微控制器串行外设接口(SPI)

    摘要:MAXQ3180微控制器是电表多相模拟前端。它具备现代多功能电表的所有功能。MAXQ3180通过串行外设互联(SPI™)总
    发表于 04-23 16:01 729次阅读
    怎样使用<b class='flag-5'>MAXQ3180</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>串行</b><b class='flag-5'>外设</b><b class='flag-5'>接口</b>(SPI)

    Using the MAXQ3180 Analog Fron

    Using the MAXQ3180 Analog Front-End in a Single-Phase Configuration Abstract: This application note
    发表于 08-11 11:55 728次阅读
    Using the <b class='flag-5'>MAXQ3180</b> Analog Fron

    在单相表架构中使用模拟前端MAXQ3180

    在单相表架构中使用模拟前端MAXQ3180 Abstract: This application note describes how to adapt the MAXQ3180
    发表于 09-05 23:20 836次阅读
    在单相表架构中使用模拟前端<b class='flag-5'>MAXQ3180</b>

    MAXQ3180 低功耗、多功能、多相AFE

    MAXQ3180 低功耗、多功能、多相AFE 概述 MAXQ3180是专用的电气参数测量前端,它采集并计算多相负载的多相电压、电流、功率、能量等多种
    发表于 12-12 20:47 967次阅读
    <b class='flag-5'>MAXQ3180</b> 低功耗、多功能、多相AFE

    MAXQ3180入门:寄存器配置

    MAXQ3180入门:寄存器配置 虽然多相、多功能电能计量AFE芯片MAXQ3180具有很多配置寄存器,但仅需配置几个寄存器即可实现基本的测量功能。本篇应用笔记介绍如何成功
    发表于 03-28 09:20 1126次阅读

    MAXQ3180入门:寄存器配置

    MAXQ3180入门:寄存器配置 虽然多相、多功能电能计量AFE芯片MAXQ3180具有很多配置寄存器,但仅需配置几个寄存器即可实现基本的测量功能。本篇应用笔记介绍如何成功
    发表于 03-28 09:20 834次阅读

    基于MAXQ3180/MAXQ3183的电能表参考设计

      参考设计为电能表使用MAXQ3180/MAXQ3183   摘要:MAXQ
    发表于 10-28 08:57 1592次阅读
    基于<b class='flag-5'>MAXQ3180</b>/<b class='flag-5'>MAXQ</b>3183的电能表参考设计

    MAXQ615 16位MAXQ微控制器的硬件乘法器

    MAXQ615是一个低功耗,16位MAXQ®微控制器低功耗应用而设计的。该设备结合了强大的16位RISC微控制器,包括多个高速串行通信
    发表于 04-18 11:32 1056次阅读

    在单相配置中使用MAXQ3180模拟前端

    虽然MAXQ3180设计用于测量三相电源,但它也可以仅使用A相输入,使B和C通道断开,从而测量单相能量。本应用笔记的其余部分描述了实现这种单相操作的简单过程。
    的头像 发表于 01-10 14:03 369次阅读
    在单相配置中使用<b class='flag-5'>MAXQ3180</b>模拟前端

    怎样使用MAXQ3180微控制器串行外设接口

    MAXQ3180微控制器是电表多相模拟前端。它具备现代多功能电表的所有功能。MAXQ3180通过串行外设互联(SPI™)总线将其读数传送给主
    的头像 发表于 02-14 18:21 618次阅读
    怎样使用<b class='flag-5'>MAXQ3180</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>串行</b><b class='flag-5'>外设</b><b class='flag-5'>接口</b>