最近因为用到了MSP430F149这个芯片,其中硬件已经设计好了,串口1和SPI1都要用,但大家都知道MSP430F149的这两个外设共用一些寄存器,两个同时用就很麻烦,所以这里我们模拟一个SPI来用,
先简单讲一下FM25CL640,

FM25CL640支持SPI模式0和3,我们这里用的模式3,详细FM25CL640资料大家可以再去百度一下。

首先是SPI引脚的初始化:

void Master_SPI_Init(void)
{ P5DIR |= BIT0+BIT1+BIT3;//SC+MOSI+SCLKP5DIR &=~BIT2;//MISO      P5OUT |= BIT0+BIT1+BIT3;//默认输出高
}

在这里用芯片的SPI1的接口(用其他IO一样的),MSP430F149,IO的方向是通过寄存器PxDIR来配置的,0是是输入,1是输出;
一组IO口有8个 P5.0到P5.7对应0到第7位。这里:
P5.0CS是片选信号,方向输出
P5.1MOSI,这个口是主机输出,从机输入,放向输出
P5.2MISO,这个口是主机输入,从机输出,放向输入
P5.3SCK,这个口是时钟信号,方向输出,
同时为了方便我们这里需要做一些定义:

#define SPI_SC_H  (P5OUT |=BIT0)
#define SPI_SC_L  (P5OUT &=~BIT0)
#define SPI_CLK_H  (P5OUT |=BIT3)
#define SPI_CLK_L  (P5OUT &=~BIT3)
#define SPI_MOSI_H (P5OUT |=BIT1)
#define SPI_MOSI_L (P5OUT &=~BIT1)
#define SPI_MISO   (P5IN&0X04)
#define uchar unsigned char
#define uint unsigned int

MSP430F149,IO口的输出寄存器是PxOUT,输入寄存器是PxIN,比如说将P5.0输出高电平,那么就把P5OUT的第0位置1,还有比如要读P5.3输入的电平,那么就去查看P5IN的第3位,上面的BIT0是为了方便使用将数字封装了下,是官方头文件里面提供的,

接下来我们先写发送一字节的函数,

void Spisend(uchar dataR)
{ for (int i=0; i<8; ++i)//一个字节8位,我们从高到低依次送出{SPI_CLK_L;        //先拉低时钟信号if (dataR & 0x80)//逻辑与,判断当前最高位为1还是0,是1就将MOSI拉高,0就拉低{SPI_MOSI_H ;    //待将数据1发送出去       }else{SPI_MOSI_L ;    //待将数据0发送出去}SPI_CLK_H;        //将时钟型号拉高,同时将数据左移一位,开始送下一位dataR<<=1;}
}

接下来写往指定的地址写指定长度的数据

void SPI_write_FM25CL64(uint address,uchar * buffer, uchar len)
{uchar addr_tempH,addr_tempL;addr_tempH=(address&0xff00)>>8;//获取高8位地址addr_tempL=address&0x00ff;//获取低8位地址SPI_SC_L ;//片选使能,Spisend(FM25CL64Wren_CMD);//FM25CL640写使能SPI_SC_H ;//注意这一步SPI_SC_L ;Spisend(FM25CL64Write_CMD);//FM25CL640写命令Spisend(addr_tempH);//发送高8位地址Spisend(addr_tempL);//发送低8位地址for( uchar i = 0; i < len; i++ ){Spisend(buffer[i]);//发送一个字节的数据到SPI芯片       }SPI_SC_H ;}

这里需要注意FM25CL64在写之前需要使能一下,其命令码如下:

 #define FM25CL64Read_CMD 0x03        //读25LC640命令0000 0011
#define FM25CL64Write_CMD 0x02      //写25LC640命令0000 0010
#define FM25CL64Wren_CMD 0x06       //写25LC640使能命令0000 0110
#define FM25CL64Wrdi_CMD 0x04      //复位 写25LC640使能命令0000 0100(禁止写操作)
#define FM25CL64Rdsr_CMD 0x05       //读25LC640状态寄存器命令0000 0101(读状态,看有没有读取结束)
#define FM25CL64Wrsr_CMD 0x01       //写25LC640状态寄存器命令0000 0001(写状态,看有没有写结束)

需要注意的这里先将片选拉低使能,然后发送写使能,发完后需要先将片选拉高,然后再次拉低开始下面的内容,我起先是一开始拉低片选直到操作完所有在拉高,结果弄了半天没写进去。操作完写使能,再次拉低片选,发写命令,然后发送地址,先发高8位再发低8位,然后写数据,我们这里用一个for循环,地址会自己递增我们不用管。写完将片选拉高就行。
接下来是读数据,先写读一个字节的

uchar Spireceive(void)
{uchar data = 0x00;        //      for (int i=0; i<8; ++i) //我们需要一位一位的读,{SPI_CLK_L;        //时钟拉低if(SPI_MISO)//这个我们在上面定义过#define SPI_MISO   (P5IN&0X04)读取P5.2的电平{data<<=1;//将数据左移一位然后加一,data +=1;//                    }else{data<<=1;//0的话直接左移,等下一位}SPI_CLK_H;        //}return (data);      //返回接收到的data
}

接下来写从指定的地址读取指定长度的数据

uchar SPI_read_FM25CL64(uint address,uchar * buffer ,uchar len)
{uchar data_temp,addr_tempH,addr_tempL;addr_tempH=(address&0xff00)>>8;//获取高8位地址addr_tempL=address&0x00ff;//获取低8位地址SPI_SC_L ;//使能片选
Spisend(FM25CL64Read_CMD);//FM25CL640读命令Spisend(addr_tempH);//发送高8位地址Spisend(addr_tempL);//发送低8位地址for( uchar i = 0; i < len; i++ ){buffer[ i ] = Spireceive();//接收一个字节的数据;    }SPI_SC_H ;return data_temp;
}

这里读不需要使能,直接发读命令然后地址(先高8位在低8位),然后循环读数据,同样地址不用管会自己递增。
这样我们的收发就写好了,然后去试试,

unsigned char TestBuff1[]={0X01,0X02,'3','4','5','6','A','B','C','D'};
unsigned char TestBuff[]={0,0,0,0,0,0,0,0,0,0};
void main(void)
{
/*下面六行程序关闭所有的IO口*/    P1DIR = 0X00;P1OUT = 0X00;P2DIR = 0X00;P2OUT = 0X00;P3DIR = 0X00;P3OUT = 0x00;P4DIR = 0X00;P4OUT = 0X00;P5DIR = 0X00;P5OUT = 0X00;P6DIR = 0X00;P6OUT = 0X00;WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗BCSCTL1 &= ~XT2OFF;                       // XT2ondo{IFG1 &= ~OFIFG;                 //清除晶振失败标志for (z = 0xFF; z > 0; z--);     //等待8MHz晶体起振}while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?BCSCTL2 |= SELM_2 + SELS;                 // MCLK= SMCLK= XT2 (safe)Master_SPI_Init();SPI_write_FM25CL64( 0x0001,  TestBuff1, 10);SPI_read_FM25CL64( 0x0001, TestBuff, 10 );
while(1)
{}
}

我们将TestBuff1数组的内容写进去,然后读出来放到TestBuff,运行后:

MSP430F149用模拟SPI和FM25CL640通信相关推荐

  1. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  2. STM32普通IO模拟SPI和W25Q32通信调试

    目录 1.参考网上的程序编写SPI读写函数 2.参考w25q32的例程读取芯片ID 3.读取芯片ID时遇到的问题 问题1:没有返回数据 问题2:返回芯片ID错误 4.优化后的收发函数和时序波形 1.参 ...

  3. STM32通信模拟SPI

    21.1 关于 SPI 21.1.1 SPI 协议 SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双工同步串行 ...

  4. 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现

    TLC2453的操作也比较简单,通过模拟的方式实现只需要看一下时序图把时序搞对即可. 在硬件SPI中,读和写实可以通过硬件同步进行的,因此在写入本次命令字时可以同时读取上一次命令的数据,在模拟SPI的 ...

  5. java如何编写spi接口_软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

  6. 软件模拟SPI接口程序代码

    目录 SPI协议简介 SPI接口介绍 SPI接口连接图 SPI数据传输方向 SPI传输模式 模拟SPI程序 SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或者 ...

  7. 用GPIO模拟SPI接口读取传感器数据

    本文基于平头哥开发板RVB2601,简要介绍了用GPIO模拟SPI时序逻辑,实现SPI协议,按照特定温度传感器的时序,读取其数据,及示例程序 一.概述 SPI(Serial Peripheral In ...

  8. 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341

    [全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...

  9. 软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

  10. GPIO模拟SPI通讯接口

    一.SPI总述 SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换.也就是说,SPI是一种规定好的通讯方式.这种通信方式的优点是占用端口较少,一般4根就够基本通讯了.同时 ...

最新文章

  1. 转载:Quartz.NET 入门
  2. java国际化程序创建属性文件,Java程序国际化学习代码一
  3. 【编程】二叉搜索树的定义
  4. ad中电容用什么封装_用什么来降低噪声?只要几个电容器就可以,简单有效!...
  5. DEM数据和影像数据下载汇总
  6. 【ZYNQ】从入门到秃头02 ZYNQ硬件介绍和Vivado开发流程
  7. 【书影观后感 十三】甲申三百七十八年祭
  8. 键盘按键名键码对照表
  9. C_Primer第12章 存储类型、链接和内存管理
  10. fore-each操作数组
  11. 智慧公厕系统让如厕成为一种享受
  12. 金蝶云苍穹笔记(四)
  13. MAC下Apktool、dex2jar、jd-gui的安装和反编译、回编译、重新签名简单使用
  14. 通过matlab对比不同调制方式下的球形译码误码率仿真,包括BPSK,QPSK,8PSK,4QAM以及16QAM
  15. 导入和导出功能用例设计
  16. 恶意软件及其类型(病毒、蠕虫、木马、间谍软件、勒索软件、恐吓软件、Bots和Rootkits等)的介绍
  17. bdd java_Java的BDD框架之间有什么区别?
  18. YAMAHA机械手的使用注意事项
  19. 2022美赛E题(森林的碳封存)——赛题解读解题思路
  20. 2023年上海租房指南(租房上篇)

热门文章

  1. atom-beautify sqlparse中文乱码|Could not find ‘sqlFormat‘ Beautify 0.28.7
  2. oracle 判断条件不在某一时间范围内(not between)
  3. 通过regsrv32.exe绕过Applocker应用程序白名单的多种方法
  4. rabbitMq入门
  5. Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller - 1C26出现感叹号,USB无法使用
  6. emcc生成wasm,wast,bc文件的方法
  7. 图神经网络 GNN GAT GCN(一)
  8. 品一品,捋一捋,回调函数获取异步操作数据
  9. 基于html5贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏
  10. Chrome浏览器取色器