关于SPI 模拟时序的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SPI 模拟时序的问题相关的知识,希望对你有一定的参考价值。

我想用51单片机的IO口模拟SPI串行通信 请各位大侠指点一下代码 思路 等等 小弟完全没有思路 谢谢

//*****************************************************************************************
//函数名:SpisendByte(INT8U dat)
//输入:发送的数据
//输出:无
//功能描述:SPI发送一个字节
//*****************************************************************************************
INT8U SpiTxRxByte(INT8U dat)

INT8U i,temp;
temp = 0;

SCK = 0;
for(i=0; i<8; i++)

if(dat & 0x80)

MOSI = 1;

else MOSI = 0;
dat <<= 1;

SCK = 1;
_nop_();
_nop_();

temp <<= 1;
if(MISO)temp++;
SCK = 0;
_nop_();
_nop_();

return temp;


//*****************************************************************************************
//函数名:void RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:复位CC1100
//*****************************************************************************************
void RESET_CC1100(void)

CSN = 0;
while (MISO);
SpiTxRxByte(CCxxx0_SRES); //写入复位命令
while (MISO);
CSN = 1;


//*****************************************************************************************
//函数名:void POWER_UP_RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:上电复位CC1100
//*****************************************************************************************
void POWER_UP_RESET_CC1100(void)

CSN = 1;
halWait(1);
CSN = 0;
halWait(1);
CSN = 1;
halWait(41);
RESET_CC1100(); //复位CC1100


//*****************************************************************************************
//函数名:void halSpiWriteReg(INT8U addr, INT8U value)
//输入:地址和配置字
//输出:无
//功能描述:SPI写寄存器
//*****************************************************************************************
void halSpiWriteReg(INT8U addr, INT8U value)

CSN = 0;
while (MISO);
SpiTxRxByte(addr); //写地址
SpiTxRxByte(value); //写入配置
CSN = 1;


//*****************************************************************************************
//函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//输入:地址,写入缓冲区,写入个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)

INT8U i, temp;
temp = addr | WRITE_BURST;
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i < count; i++)

SpiTxRxByte(buffer[i]);

CSN = 1;


//*****************************************************************************************
//函数名:void halSpiStrobe(INT8U strobe)
//输入:命令
//输出:无
//功能描述:SPI写命令
//*****************************************************************************************
void halSpiStrobe(INT8U strobe)

CSN = 0;
while (MISO);
SpiTxRxByte(strobe); //写入命令
CSN = 1;


//*****************************************************************************************
//函数名:INT8U halSpiReadReg(INT8U addr)
//输入:地址
//输出:该寄存器的配置字
//功能描述:SPI读寄存器
//*****************************************************************************************
INT8U halSpiReadReg(INT8U addr)

INT8U temp, value;
temp = addr|READ_SINGLE;//读寄存器命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;


//*****************************************************************************************
//函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//输入:地址,读出数据后暂存的缓冲区,读出配置个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)

INT8U i,temp;
temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i < count; i++)

buffer[i] = SpiTxRxByte(0);

CSN = 1;


//*****************************************************************************************
//函数名:INT8U halSpiReadReg(INT8U addr)
//输入:地址
//输出:该状态寄存器当前值
//功能描述:SPI读状态寄存器
//*****************************************************************************************
INT8U halSpiReadStatus(INT8U addr)

INT8U value,temp;
temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;


我还有其他的,其实想这样的模拟的很简单的,网上也很多,我做了个点阵用SPI的方式,但是那是自带的,
参考技术A SPI通信分为主机和从机两端,主机提供时钟。
SPI分3根引脚,一个MISO,一个MOSI,还一个SCK;
MISO:主机输入,从机输出引脚,数据由从机到主机;
MOSI:主机输出,从机输入引脚,数据由主机到从机;
SCK:时钟引脚,在上升沿或者下降沿(根据情况)时,读取或输出MISO/MOSI的电平;

具体的程序可以上网搜索下

STM32和FPGA通过SPI进行通讯

您好,我现在需要通过STM32与FPGA利用SPI进行通讯,FPGA选用的是XILINX的芯片,请问这两者之间如何实现呢,有没有参考的源代码,感谢您的帮助

参考技术A 先看下SPI的时序吧,这个简单,但SPI时序不唯一,随便用一种就可以,然后stm32的程序网上很多,建议用模拟的先做测试,如果有示波器可以直接用STM32SPI模块,FPGA的话很灵活,知道了stm32的时序后,一配合STM32就可了,至于用Verilog还是VHDL看个人爱好了,网上搜Verilog SPI程序应该能找到好多,而且硬件描述语言和芯片基本无关,找来的代码直接贴上都能用。stm32找来代码一般不能用,要调试一下。Q308680190本回答被提问者采纳 参考技术B 看时序图,会写vhdl吗?会的话,知道时序就可以实现

以上是关于关于SPI 模拟时序的问题的主要内容,如果未能解决你的问题,请参考以下文章

模拟SPI协议时序

使用软件模拟spi 时序时注意点

STM32入门开发: 介绍SPI总线读写W25Q64(FLASH)(硬件+模拟时序)

STM32入门开发: 介绍SPI总线读写W25Q64(FLASH)(硬件+模拟时序)

单片机模拟SPI协议和单片机自带SPI接口的区别?使用起来会有差别吗,会不会影响最终效果?

14-Linux gpio模拟spi