历史上的今天
返回首页

历史上的今天

今天是:2025年02月26日(星期三)

正在发生

2020年02月26日 | MSP430 SPI驱动 代码设计流程

2020-02-26 来源:eefocus

平常工作中,如果使用MSP430作为主控芯片,经常会遇到需要编写SPI 或 I2C 驱动,来读取和控制外设(比如LCD屏幕,一些传感器)的情况。为了减少重复性工作,本文以具体实例来总结SPI驱动编写的详细步骤(用MSP430FR6989来驱动集成模拟前端AFE4400):


单片机SPI引脚设置

一般SPI有3线和4线之分,区别在于是否带片选端——STE引脚,4个引脚功能说明: 

UCxS0MI:主模式数据输入,从模式下数据输出; 

UCxSIMO:主模式数据输出,从模式下数据输入; 

UCxCLK:USCI SPI的时钟; 

UCxSTE:USCI SPI的使能端;


引脚设置代码:


void Set_UCB0_SPI(void)

{

  P1SEL0 |= BIT4 | BIT6 | BIT7;   // 激活相应引脚为SPI功能,这里使用USCI_B0 (SPI P1.4 UCB0CLK P1.7 UCB0SOMI )                  

  P1DIR &= ~BIT6;                 // P1.6 UCB0SOMI 这里的单片机是主机,设置为输入方向

  P1DIR |=  BIT5 | BIT4 | BIT7;   //  P1.5(SPI STE)P1.4(UCB0CLK)P1.7(UCB0SOMI)都是输出引脚

  P1OUT |= BIT5;                  // 使能端置高,此时不进行SPI通信

  PM5CTL0 &= ~LOCKLPM5;      // 激活单片机以上引脚的设置,注意!!!MSP430FR系列单片机特殊命令,之前没有发现这一

                             //条命令,所有的引脚配置均不工作,我被00坑了半天!!!

  UCB0CTLW0 |= UCSWRST;                     // Enable SW reset

  UCB0CTLW0 |= UCMSB+UCCKPH+UCMST+UCSYNC;   

    //  1 -  Synchronous mode 

    // [b2-1] 00-  3-pin SPI

    // [b3]   1 -  Master mode

    // [b4]   0 - 8-bit data

    // [b5]   1 - MSB first

    // [b6]   0 - Clock polarity high.

    //[b7] 1 - Clock phase - Data is captured on the first UCLK edge and changed on the following edge.

    //以上设置参考需要驱动的模块的手册,注意[b3] [b4]位!

  UCB0CTLW0 |= UCSSEL_2;          // SMCLK

  UCB0BR0 = 0x01;                 // 16 MHz

  UCB0BR1 = 0;                    //

  UCB0CTLW0 &= ~UCSWRST;          // Clear SW reset, resume operation

  //UCB0IE = 0x00;

}


SPI读写时序设置

根据的数据手册,读懂模块的SPI读写时序是编写成功的关键步骤!!! 

以下是AFE4400的SPI读写时序图:


读数据时:拉低STE,先发送一个字节的寄存器地址给AFE4400,等待一会后,AFE4400会返回该地址的数据到单片机,一个字节一个字节地发送,共3个字节24位数据。(单片机需要一次发送 三次接收) 

写数据时:拉低STE,先发送想要写入的寄存器地址,然后依次发送3个字节24位的数据,就可以改变AFE4400中相应寄存器的数据。(单片机需要一次发送 三次接收)


SPI读取AFE4400寄存器值的代码:


unsigned long AFE4400_Reg_Read(unsigned char Reg_address)

{

  unsigned char SPI_Rx_buf[4]; //存放读取到的寄存器值

  unsigned long retVal;

  retVal = 0;

  P1OUT&= ~BIT5;   //  拉低STE


  UCB0TXBUF = Reg_address;          // 发送需要读取的寄存器地址

  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?

  SPI_Rx_buf[0] = UCB0RXBUF;        // 读取接收到的数据,此时为空数据

  UCB0TXBUF = 0;                    // 空指令,等待延时作用

  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?

  SPI_Rx_buf[1] = UCB0RXBUF;        // 读取接收到的数据: Data[23:16]

  UCB0TXBUF = 0;                   // 空指令,等待延时作用

  while ( (UCB0STAT & UCBUSY) );    // USCI_B0 TX buffer ready?

  SPI_Rx_buf[2] = UCB0RXBUF;        // 读取接收到的数据: Data[15:8]

  UCB0TXBUF = 0;                   // 空指令,等待延时作用

  while ( (UCB0STAT & UCBUSY) );        // USCI_B0 TX buffer ready?

  SPI_Rx_buf[3] = UCB0RXBUF;            // 读取接收到的数据: Data[7:0]


  P1OUT|=BIT5;  // 读取完成,拉高STE

  retVal = SPI_Rx_buf[1];  //数据整合成24位数据

  retVal = (retVal << 8) | SPI_Rx_buf[2];

  retVal = (retVal << 8) | SPI_Rx_buf[3]; 


  return    retVal;

}


SPI把数据写入AFE4400寄存器中的代码:


void AFE4400_Reg_Write (unsigned char reg_address, unsigned long data)

{

  unsigned char dummy_rx;


  P1OUT&= ~BIT5;   //  拉低STE


  UCB0TXBUF = reg_address;        // 发送需要写入的寄存器地址

  while ( (UCB0STAT & UCBUSY) );  // USCI_B0 TX buffer ready?

  dummy_rx = UCB0RXBUF;         // 空指令,等待延时作用

  UCB0TXBUF = (unsigned char)(data >>16);  // 把需要写入的数据: Data[23:16]传给发送缓存器

  while ( (UCB0STAT & UCBUSY) );        // USCI_B0 TX buffer ready?

  dummy_rx = UCB0RXBUF;         // 空指令,等待延时作用

  UCB0TXBUF = (unsigned char)(((data & 0x00FFFF) >>8));   // 把需要写入的数据: Data[15:8]传给发送缓存器 

  while ( (UCB0STAT & UCBUSY) );              // USCI_B0 TX buffer ready?

  dummy_rx = UCB0RXBUF;                       // 空指令,等待延时作用

  UCB0TXBUF = (unsigned char)(((data & 0x0000FF)));     // 把需要写入的数据: Data[7:0]传给发送缓存器

  while ( (UCB0STAT & UCBUSY) );                        // USCI_B1 TX buffer ready?

  dummy_rx = UCB0RXBUF;                         // 空指令,等待延时作用


  P1OUT|=BIT5;  // 写入完成,拉高STE

}


寄存器写入

完成以上两步我们后,AFE4400就可以乖乖地为我们所用,非常听我们的话!通过查看寄存器功能手册,写入相应的值对AFE4400的功能进行配置,可以实现我们想要的功能。 

AFE4400的一些寄存器:

这里写图片描述

推荐阅读

史海拾趣

EasySync公司的发展小趣事

经过几年的努力,EasySync公司在同步技术领域取得了重大突破,成功研发出一款高效、稳定的同步芯片。这款芯片不仅性能卓越,而且成本较低,受到了广大客户的青睐。随着产品销量的不断增加,公司开始拓展市场,将产品销售到全球各地,逐渐树立了品牌形象。

Calex Mfg Co Inc公司的发展小趣事

在国内市场取得一定成绩后,Calex Mfg. Co., Inc.开始积极拓展海外市场。公司制定了全球化战略,通过参加国际展会、建立海外销售网络等方式,不断开拓国际市场。同时,公司还根据不同地区的市场需求,推出定制化的产品和服务,进一步提升了其在国际市场中的竞争力。

FEMA Electronics Corporation公司的发展小趣事

FEMA的创始人李明(化名)是一位资深的电子工程师,他在一次与客户的交流中,发现了市场对高质量电子元件的迫切需求。于是,他毅然决定创办FEMA,专注于研发和生产高性能的电子元器件。创业初期,公司面临着资金短缺、技术瓶颈等重重挑战。然而,李明凭借坚定的信念和不懈的努力,成功攻克了技术难关,并与多家知名企业建立了合作关系,为公司的发展奠定了坚实的基础。

柯爱亚(ceaiya)公司的发展小趣事

在电子行业的发展历程中,柯爱亚以其对技术创新的执着追求而闻名。1999年,柯爱亚成功研发出超薄型功率电感CDH2D11/CD31,并率先实现了量产。这一创新不仅提升了产品的性能,而且满足了市场对于更轻薄、更高效电子元件的迫切需求。柯爱亚凭借这一技术突破,迅速在市场中脱颖而出,赢得了业界的广泛认可。

Freqtech Ohg公司的发展小趣事

在电子行业的激烈竞争中,Freqtech Ohg公司深知技术创新的重要性。公司投入大量研发资源,专注于高频电子技术的研发。经过数年的努力,Freqtech成功开发出一款高性能的高频滤波器,该产品在信号传输效率和稳定性方面远超同类竞品。这一技术创新不仅为公司赢得了国内外多个重要客户,还使得Freqtech在高频电子领域迅速崛起,成为行业内的佼佼者。

EVER-WAY公司的发展小趣事

在电子产品制造行业,品质是企业的生命线。EVER-WAY公司一直高度重视品质管理,建立了完善的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。同时,公司还加强了对员工的培训和教育,提高了员工的品质意识和操作技能。这些品质管理的提升不仅保证了公司产品的优良品质,也赢得了客户的信任和好评。

问答坊 | AI 解惑

AGPS和DGPS有何区别?

      AGPS就是移动通讯系统的定位功能,该功能首先在CDMA系统中实现。因CDMA系统需要严格的同步时钟, 该时钟源来自GPS,加上基站的位置可知,于是高精度的定位就可以实现了,不过此技术无法实现大范围机动高精度定位,只 ...…

查看全部问答>

CS1610EP静态VFD显示驱动电路

本帖最后由 jameswangsynnex 于 2015-3-3 20:03 编辑 CS1610EP静态VFD显示驱动电路很详细的提供了驱动电路,给大家一个很详细的电路 …

查看全部问答>

matlab信号处理详解

《Matlab信号处理详解》详细介绍Matlab在数字信号处理中的应用实例,各种数字滤波器的设计,包含源程序…

查看全部问答>

H-FLASHER查询不到Flash怎么回事啊。

我用的LPC2378,使用H-JTAG几乎都可以查询到芯片,再用H-FLASHER时大多数只能查到\"Target:ARM7TDMI-S Little-Endian\",而在\"Flash:ERROR\"。在H-FLASHER里选芯片选过LPC 2378和LPC2378_A都不好用。我的并口设置的是SPP模式。…

查看全部问答>

高性能低成本S3C2416微型ARM9嵌入式模块

◆ 全面替代S3C2440,且性价比更优 ◆ 模块背面无任何器件,方便直接贴焊或通过插针与底板相连 ◆ 商业级(0°~70°)、工业级(-40°~85°) ◆ 微尺寸(40x40x4mm)、低价格(千片价…

查看全部问答>

vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之

如题:我想在winCE里写一个FTP上传文件的程序,vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 错误        1        ...…

查看全部问答>

usb mass storage 问题

MARVELL PXA310+WM6.0(littleton的BSP)下添加usb mass storage 功能: 以便设备连接到PC上时,能使SD卡像U盘一样在“我的电脑”里呈现出一个盘符, 不通过ActiveSync而是通过usb直接访问。 现在注册表设置好了(99%没错),usbmsfn.dll也已经 ...…

查看全部问答>

pwm电路控制的直流电机

做了个PWM电路来控制直流电机,用C语言编译后,在keil中运行时有5个警告,不知错在何地方,请内行指点下,本人不胜感激!见原图: …

查看全部问答>

初学嵌入开发,请问看哪些书籍会比较合适

大家好,我是初学嵌入开发,请问看哪些书籍会比较合适。 谢谢。 …

查看全部问答>

关于assert的错误

在有些时候,建好工程后调试会出现assert的错误,这个错误不知道是怎么回事,好象跟设置和程序都没关系.请问这个错误怎么处理的…

查看全部问答>