资源简介

STM32 模拟SPI 一主多从

资源截图

代码片段和文件信息

#include “TestSPI.h“



/* SPI端口初始化 */  
void SPI1_Init()
{  
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(SPI_CLK_PERIPH ENABLE); // 使能GPIO时钟
RCC_AHB1PeriphClockCmd(SPI_MISO_PERIPH ENABLE); // 使能GPIO时钟
RCC_AHB1PeriphClockCmd(SPI_MOSI_PERIPH ENABLE); // 使能GPIO时钟
RCC_AHB1PeriphClockCmd(LSM303D_SPI_NSS_PERIPH ENABLE); // 使能GPIO时钟
RCC_AHB1PeriphClockCmd(L3GD20_SPI_NSS_PERIPH ENABLE); // 使能GPIO时钟
 
  //SPI CLK GPIO设置
  GPIO_InitStructure.GPIO_Pin = SPI_CLK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
  GPIO_Init(SPI_CLK_PORT &GPIO_InitStructure);

//SPI MOSI GPIO设置
GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN;
  GPIO_Init(SPI_MOSI_PORT &GPIO_InitStructure);

//SPI L3GD20 NSS GPIO设置
GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_NSS_PIN;
GPIO_Init(L3GD20_SPI_NSS_PORT &GPIO_InitStructure);

//SPI LSM303D NSS GPIO设置
GPIO_InitStructure.GPIO_Pin = LSM303D_SPI_NSS_PIN;
GPIO_Init(LSM303D_SPI_NSS_PORT &GPIO_InitStructure);

//SPI MISO GPIO设置
GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(SPI_MISO_PORT &GPIO_InitStructure);

//拉低SCK和MOSI
GPIO_ResetBits(SPI_CLK_PORT SPI_CLK_PIN); // 拉低
GPIO_ResetBits(SPI_MOSI_PORT SPI_MOSI_PIN); // 拉低

//拉高片选线
GPIO_SetBits(LSM303D_SPI_NSS_PORT LSM303D_SPI_NSS_PIN); // 拉高
GPIO_SetBits(L3GD20_SPI_NSS_PORT L3GD20_SPI_NSS_PIN); // 拉高
}  

/*  
LSM303D使能  
enable:为1时,使能信号有效,SS低电平  
为0时,使能信号无效,SS高电平  
*/  
void LSM303D_SS_Enable(int enable)
{  
if (enable)
{
GPIO_ResetBits(LSM303D_SPI_NSS_PORT LSM303D_SPI_NSS_PIN); //SS低电平,从设备使能有效  
}
else  
{
GPIO_SetBits(LSM303D_SPI_NSS_PORT LSM303D_SPI_NSS_PIN); //SS高电平,从设备使能无效  
}
}

/*  
L3GD20使能  
enable:为1时,使能信号有效,SS低电平  
为0时,使能信号无效,SS高电平  
*/  
void L3GD20_SS_Enable(int enable)
{  
if (enable)
{
GPIO_ResetBits(L3GD20_SPI_NSS_PORT L3GD20_SPI_NSS_PIN); //SS低电平,从设备使能有效  
}
else  
{
GPIO_SetBits(L3GD20_SPI_NSS_PORT L3GD20_SPI_NSS_PIN); //SS高电平,从设备使能无效  
}
}

// 设置GPIO的值
void Set_GPIO_Value(GPIO_TypeDef* GPIOx uint16_t GPIO_Pin uint8_t Value)
{
if (Value)
{
GPIO_SetBits(GPIOx GPIO_Pin); //SS高电平,从设备使能无效  
}
else  
{
GPIO_ResetBits(GPIOx GPIO_Pin); //SS低电平,从设备使能有效  
}
}

uint8_t Simulate_SPI_SendByte(uint8_t dt)
{
u8 i = 0 temp = 0 nMISO = 0;

for(i = 8; i > 0; i--)
{
if(dt & 0x80)
{
Set_GPIO_Value(SPI_MOSI_PORT SPI_MOSI_PIN 1);//MOSI_H;
}
else
{
Set_GPIO_Value(SPI_MOSI_PORT SPI_MOSI_PIN 0);//MOSI_L;
}

dt <<= 1;
Set_GPIO_Value(SPI_CLK_PORT SPI_CLK_PIN 1);//SCLK_H;
__nop();
__nop();
__nop();
temp <<= 1;
nMISO = GPIO_ReadInputDataBit(SPI_MISO_PORT SPI_MISO_PIN);
if(nMISO)
{
temp++;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3353  2016-05-26 20:21  SimulationSPI1\TestSPI.c

     文件       1275  2016-05-26 20:16  SimulationSPI1\TestSPI.h

     目录          0  2016-05-26 20:29  SimulationSPI1

----------- ---------  ---------- -----  ----

                 4628                    3


评论

共有 条评论