99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣使用MAXQ3180微控制器的串行外設(shè)接口

星星科技指導(dǎo)員 ? 來(lái)源:ADI ? 作者:ADI ? 2023-02-14 18:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MAXQ3180微控制器是電表多相模擬前端。它具備現(xiàn)代多功能電表的所有功能。MAXQ3180通過(guò)串行外設(shè)互聯(lián)(SPI?)總線將其讀數(shù)傳送給主機(jī)微控制器。本應(yīng)用筆記介紹怎樣實(shí)現(xiàn)這一接口,演示實(shí)例代碼以幫助設(shè)計(jì)人員實(shí)現(xiàn)這一通信機(jī)制。

SPI簡(jiǎn)介

串行外設(shè)接口(SPI)是器件間總線協(xié)議,實(shí)現(xiàn)芯片間的快速、同步、全雙工通信。由一個(gè)主機(jī)驅(qū)動(dòng)同步時(shí)鐘,選擇對(duì)哪些從機(jī)尋址。每個(gè)SPI外設(shè)含有一個(gè)移位寄存器控制電路,使被尋址的串行外設(shè)接口SPI外設(shè)能夠同時(shí)發(fā)送和接收數(shù)據(jù)。

poYBAGPrYJWAVkJ8AAALt5HL6dM206.gif?imgver=1

圖1. SPI從機(jī)示意圖

SPI通信采用了四種不同的電路:

SCLK:所有器件使用的同步時(shí)鐘。主機(jī)驅(qū)動(dòng)該時(shí)鐘,從機(jī)接收時(shí)鐘。注意,SCLK可以被選通,不需要在SPI操作之間進(jìn)行驅(qū)動(dòng)。

MOSI:主機(jī)出,從機(jī)入。這是主機(jī)在SPI總線上驅(qū)動(dòng)所有從機(jī)的主要數(shù)據(jù)線。只有所選的從機(jī)同步來(lái)自MOSI的數(shù)據(jù)。

MISO:主機(jī)入,從機(jī)出。這是所選從機(jī)向主機(jī)發(fā)送時(shí)驅(qū)動(dòng)的主要數(shù)據(jù)線。只有所選的從機(jī)可以驅(qū)動(dòng)該電路。實(shí)際上,這是SPI總線安排中允許從機(jī)驅(qū)動(dòng)的唯一電路。

SSEL:該信號(hào)在每一從機(jī)上都不同。當(dāng)有效(通常為低電平)時(shí),所選從機(jī)必須驅(qū)動(dòng)MISO。

對(duì)于這一討論,需要特別說(shuō)明的是,SPI外設(shè)同時(shí)發(fā)送和接收。最簡(jiǎn)單的理解是主機(jī)總是發(fā)送一個(gè)字節(jié),接收一個(gè)字節(jié)。

有些SPI外設(shè)犧牲速率以模擬半雙工工作。MAXQ3180微控制器沒(méi)有采用這一方式,它是真正的全雙工SPI從機(jī)。

本應(yīng)用筆記的其他部分介紹怎樣連接并成功使用SPI總線上的MAXQ3180。

MAXQ3180通信簡(jiǎn)介

對(duì)于主機(jī),MAXQ3180看起來(lái)象一個(gè)存儲(chǔ)器陣列,同時(shí)含有RAMROM。這是因?yàn)镸AXQ3180中的ROM固件讀取RAM的工作參數(shù),將結(jié)果放到RAM中。因此,配置MAXQ3180和對(duì)RAM進(jìn)行塊寫入一樣簡(jiǎn)單。

有些MAXQ3180 “存儲(chǔ)”位置觸發(fā)器件內(nèi)部操作,“隨時(shí)”計(jì)算電表測(cè)量結(jié)果。向這些位置寫入的是“nop”。對(duì)RAM和虛擬ROM位置特殊功能和目的的討論已經(jīng)超出了本文檔的范圍。此處最重要的是微控制器的確只有兩種SPI通信操作:讀和寫。

MAXQ3180中的每一次操作以主機(jī)發(fā)送兩個(gè)字節(jié)開(kāi)始,它含有命令(例如,讀或者寫)、要訪問(wèn)的地址、訪問(wèn)的字節(jié)數(shù)。如前所述,每個(gè)SPI外設(shè)對(duì)接收到的每個(gè)字節(jié)返回一個(gè)字節(jié)。因此,MAXQ3180在接收到第一個(gè)命令字節(jié)后返回0xC1,第二個(gè)命令字節(jié)后返回0xC2。該協(xié)議顯示在下面的圖2中。

poYBAGPrYWSAfat_AABzPX8AdpE854.png

圖2. 主機(jī)向MAXQ3180讀寫數(shù)據(jù)

如果主機(jī)讀取一個(gè)或者多個(gè)字節(jié),它必須發(fā)送空字節(jié)。記住,主機(jī)不能接收來(lái)自從機(jī)的任何信息,除非它發(fā)送某些信息:發(fā)送一個(gè)字節(jié)以得到一個(gè)字節(jié)。但是接收一條命令后,MAXQ3180要計(jì)算結(jié)果,當(dāng)主機(jī)發(fā)送空字節(jié)時(shí),它可能還沒(méi)有準(zhǔn)備好。出于這一原因,MAXQ3180總是在發(fā)送數(shù)據(jù)之前發(fā)送零或者NAK字符等多個(gè)字節(jié)(0x4E或者ASCII 'N'),隨后是一個(gè)ACK字符(0x41,或者ASCII 'A')。

如果主機(jī)寫入一個(gè)或者多個(gè)字節(jié),發(fā)送命令后,它立即發(fā)送要寫入的數(shù)據(jù)。MAXQ3180為每一個(gè)數(shù)據(jù)字節(jié)返回ACK (0x41)。然后,它返回NAK (0x4E),直到寫周期完成,隨后返回最終ACK。

注意,最終ACK之后,MAXQ3180立即準(zhǔn)備開(kāi)始下一操作;它不需要進(jìn)行任何其他等待。它甚至不需要觸發(fā)SSEL以開(kāi)始下一操作。MAXQ3180知道第一次操作已經(jīng)完成,準(zhǔn)備進(jìn)行下一操作。

不論什么原因,如果需要復(fù)位主機(jī)和MAXQ3180之間的通信(例如,如果通信是異步的),從第一個(gè)命令字節(jié)重新啟動(dòng)通信之前,主機(jī)只需要等待200ms。200ms延時(shí)指示MAXQ3180,主機(jī)放棄了前面的操作。

命令字節(jié)

命令字節(jié)告訴MAXQ3180:

申請(qǐng)的操作是READ還是WRITE

操作的長(zhǎng)度

RAM中要改動(dòng)的地址(或者要讀取的虛擬ROM地址)

pYYBAGPrYYOAMpywAAAoTtx-Ljw784.png

圖3. 命令字節(jié)結(jié)構(gòu)

第一個(gè)命令字節(jié)(圖3)告訴MAXQ3180,所申請(qǐng)的操作是READ還是WRITE,以及操作的長(zhǎng)度。命令字節(jié)結(jié)構(gòu)如下:

Length Code Data Length
0b00 1 byte
0b01 2 bytes
0b10 4 bytes
0b11 8 bytes

命令字節(jié)1的其他部分和所有的命令字節(jié)2提供要訪問(wèn)的RAM字節(jié)的地址(或者一樣的虛擬ROM功能)。

主機(jī)軟件設(shè)計(jì)

雖然MAXQ3180含有一個(gè)硬件SPI控制器,ROM固件中的軟件程序還是要處理每一消息字節(jié)。出于這一原因,連續(xù)字節(jié)之間需要有延時(shí)。在當(dāng)前的MAXQ3180型號(hào)中,這一延時(shí)不得小于100μs才能實(shí)現(xiàn)可靠的工作。請(qǐng)參考圖4和圖5。

poYBAGPrYYiAFNw9AABtEn11kvA496.png

圖4. 讀取MAXQ3180的流程圖

poYBAGPrYY6AZzf8AAByIZmTAi8035.png

圖5. 寫入MAXQ3180的流程圖

代碼清單

提供代碼以實(shí)現(xiàn)具有內(nèi)置SPI主機(jī)的MAXQ2000微控制器和MAXQ3180的接口。其他微控制器用戶需要提供自己的SPI原語(yǔ),還可能要修改高層子程序。

在下面的清單中,dly_us子程序使程序線程停止執(zhí)行幾個(gè)微秒。定義SPI_TIMEOUT常數(shù)以提供比字符超時(shí)時(shí)間更長(zhǎng)的參數(shù)。

在高層子程序中,采用ENUM按名稱來(lái)選擇寄存器。在其他參數(shù)中,它提供register_lookup_table陣列的索引,含有每個(gè)MAXQ3180寄存器的寄存器長(zhǎng)度。請(qǐng)參考圖6、圖7和圖8。

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. ReadAFE (SPI_Read)子程序代碼

void Write_AFE(enum METER_REGISTER_RECORD reg, uint16 reg_addr, uint32 data)
{
  uint8 i, regadd, command_code = 0x80;
  int x;
  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 hardware 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();
  if (i == SPI_COMMAND_RETRIES) goto spierror;
  Send_SPI(regadd);
  for(i=0; i> (i * 8)) & 0xff);
  i = 0; while((Send_SPI(0) != 'A') && (++i < SPI_RETRIES));

spierror:
  SPI_DESELECT_0;
}

圖8. Write_AFE (SPI_Write)子程序代碼

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7936

    瀏覽量

    154268
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1793

    瀏覽量

    95373
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2958

    瀏覽量

    89573
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    16位微控制器MAXQ613電子資料

    概述:MAXQ613是一款低功耗、16位MAXQ 微控制器 ,設(shè)計(jì)用于通用 遙控 、消費(fèi)類 電子 和白色家電等低功耗產(chǎn)品。器件結(jié)合了強(qiáng)大的16位RISC
    發(fā)表于 04-13 07:35

    MAX3180/MAXQ3180中文資料pdf

    MAXQ3180是專用的電氣參數(shù)測(cè)量前端,它采集并計(jì)算多相負(fù)載的多相電壓、電流、功率、能量等多種計(jì)量參數(shù)和功率品質(zhì)參數(shù)。外部主機(jī)通過(guò)片內(nèi)串行外設(shè)接口(SPI™)總線讀出計(jì)算
    發(fā)表于 06-30 11:41 ?124次下載

    MAXQ3180 Low-Power, Multifunct

    The MAXQ3180 is a dedicated electricity measurement front-end that collects and calculates
    發(fā)表于 02-06 12:44 ?26次下載

    如何使用MAXQ3180的低功耗測(cè)量模式與停止模式

    如何使用MAXQ3180的低功耗測(cè)量模式與停止模式:1. MAXQ3180 的多種工作模式......................................... 22. MAXQ3180
    發(fā)表于 10-31 07:58 ?16次下載

    怎樣使用MAXQ3180微控制器串行外設(shè)接口(SPI)

    摘要:MAXQ3180微控制器是電表多相模擬前端。它具備現(xiàn)代多功能電表的所有功能。MAXQ3180通過(guò)串行外設(shè)互聯(lián)(SPI™)總
    發(fā)表于 04-23 16:01 ?826次閱讀
    <b class='flag-5'>怎樣</b>使用<b class='flag-5'>MAXQ3180</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</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
    發(fā)表于 08-11 11:55 ?899次閱讀
    Using the <b class='flag-5'>MAXQ3180</b> Analog Fron

    在單相表架構(gòu)中使用模擬前端MAXQ3180

    在單相表架構(gòu)中使用模擬前端MAXQ3180 Abstract: This application note describes how to adapt the MAXQ3180
    發(fā)表于 09-05 23:20 ?987次閱讀
    在單相表架構(gòu)中使用模擬前端<b class='flag-5'>MAXQ3180</b>

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

    MAXQ3180 低功耗、多功能、多相AFE 概述 MAXQ3180是專用的電氣參數(shù)測(cè)量前端,它采集并計(jì)算多相負(fù)載的多相電壓、電流、功率、能量等多種
    發(fā)表于 12-12 20:47 ?1117次閱讀
    <b class='flag-5'>MAXQ3180</b> 低功耗、多功能、多相AFE

    MAXQ3180入門:寄存配置

    MAXQ3180入門:寄存配置 雖然多相、多功能電能計(jì)量AFE芯片MAXQ3180具有很多配置寄存,但僅需配置幾個(gè)寄存即可實(shí)現(xiàn)基本
    發(fā)表于 03-28 09:20 ?1274次閱讀

    基于MAXQ3180/MAXQ3183的電能表參考設(shè)計(jì)

      參考設(shè)計(jì)為電能表使用MAXQ3180/MAXQ3183   摘要:MAXQ
    發(fā)表于 10-28 08:57 ?1809次閱讀
    基于<b class='flag-5'>MAXQ3180</b>/<b class='flag-5'>MAXQ</b>3183的電能表參考設(shè)計(jì)

    MAXQ3180 MAXQ3183 AFE的電表參考設(shè)計(jì)

    MAXQ3180MAXQ3183是兩款三相多功能計(jì)量模擬前端(AFE),它可以提供如功率因素、功率矢量和以及諧波分量等許多先進(jìn)的功率監(jiān)視特性。對(duì)于電表設(shè)計(jì)而言,對(duì)計(jì)量精度和電快速瞬變(EFT)有嚴(yán)格要求,Maxim提供的參考設(shè)計(jì)通過(guò)了EFT和精度等方面的嚴(yán)格測(cè)試。這些設(shè)
    發(fā)表于 03-09 11:51 ?0次下載
    <b class='flag-5'>MAXQ3180</b> <b class='flag-5'>MAXQ</b>3183 AFE的電表參考設(shè)計(jì)

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

    MAXQ615是一個(gè)低功耗,16位MAXQ?微控制器低功耗應(yīng)用而設(shè)計(jì)的。該設(shè)備結(jié)合了強(qiáng)大的16位RISC微控制器,包括多個(gè)高速串行通信
    發(fā)表于 04-18 11:32 ?1242次閱讀

    在單相配置中使用MAXQ3180模擬前端

    雖然MAXQ3180設(shè)計(jì)用于測(cè)量三相電源,但它也可以僅使用A相輸入,使B和C通道斷開(kāi),從而測(cè)量單相能量。本應(yīng)用筆記的其余部分描述了實(shí)現(xiàn)這種單相操作的簡(jiǎn)單過(guò)程。
    的頭像 發(fā)表于 01-10 14:03 ?793次閱讀
    在單相配置中使用<b class='flag-5'>MAXQ3180</b>模擬前端

    如何在MAXQ3180微控制器上使用串行外設(shè)接口

    MAXQ3180微控制器為電表的多相模擬前端。它集成了現(xiàn)代多功能電能計(jì)量所需的所有功能。MAXQ3180通過(guò)串行外設(shè)
    的頭像 發(fā)表于 01-16 09:30 ?1851次閱讀
    如何在<b class='flag-5'>MAXQ3180</b><b class='flag-5'>微控制器</b>上使用<b class='flag-5'>串行</b><b class='flag-5'>外設(shè)</b><b class='flag-5'>接口</b>

    使用MAXQ610微控制器上的串行端口

    MAXQ610微控制器提供兩個(gè)標(biāo)準(zhǔn)的USART串行端口。異步模式1是MAXQ610串行端口支持的模式之一,可用于與PC COM端口和許多其他
    的頭像 發(fā)表于 02-20 13:42 ?1296次閱讀