OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 181545|回复: 159

STM32 SPI双机通信(主从全双工),绝对原创,申请酷帖

  [复制链接]

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2013-7-22 14:35:32 | 显示全部楼层 |阅读模式

个人心得:在做主从双机通信时,一定要理解好主机和从机的作用,做主机时会控制通信的时钟,从机是不能产生时钟的。如果从机要发送数据,那可以在主机发送数据 的时钟上发送数据。配置上差不多是一样的,就设计主从就得了。我这里接收都是用中断。
还有一点要注意的,做主机接收时,不能和发送共用一个函数。这个为什么我自己现在也没有清楚,只是在实验中测得。 

 纠错:从机的接收函数改成,这时因为我测试完成后有改动就压包,后来测试发现主机不能正常接收到数据
更正:我之前的两个时钟的理论是不合理的,因为全双工收发是可以共用时钟的,这个我在后面改进的主机程序中有体现。


欢迎大家测试


u8 SPI1_ReadByte(u8 TxData)
{  
 u8 retry=0;    
// while((SPI1->SR&1<<1)==0)//等待发送区空 
// {
//  retry++;
//  if(retry>200)return 0;
// }    
// SPI1->DR=TxData;     //发送一个byte
 retry=0;
 while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
 {
  retry++;
  if(retry>200)return 0;
 }            
 return SPI1->DR;          //返回收到的数据       
}

                                      

工具STM32 MINI板两块

STM32 SPI说明http://www.docin.com/p-49456718.html

注意:NSS软件管理模式,主机:SSM=1,SSI=1

                                         从机:SSM=1,SSI=0;

连线主机 SCK<-> SCK 从机

                           MISO <-> MISO

                            MOSI<-> MOSI
程序部分:

主机

#include "sys.h" //系统子函数
#include "usart.h"//串口子函数  
#include "delay.h" //延时子函数
 // SPI总线速度设置
#define SPI_SPEED_2   0
#define SPI_SPEED_8   1
#define SPI_SPEED_16  2
#define SPI_SPEED_256 3

u8 Master_Temp =0;
void SPI1_Init(void);    //初始化SPI口
void SPI1_SetSpeed(u8 SpeedSet); //设置SPI速度  
u8 SPI1_ReadWriteByte(u8 TxData);//SPI总线读写一个字节

int main(void)
{
   Stm32_Clock_Init(3); //系统时钟设置
   delay_init(24);//延时函数初始化
   uart_init(24,9600); //串口初始化
   SPI1_Init(); //SPI1初始化
   SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频
   while(1)
   { 
       SPI1_ReadWriteByte(0x55);
       SPI1_ReadWriteByte(0x66);
       printf("Master_Temp  =%x\r\n",Master_Temp );
      delay_ms(100); 
   }
}

//SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)

         RCC->APB2ENR|=1<<0; //复用
         RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
        RCC->APB2ENR|=1<<12;      //SPI1时钟使能
    
     //这里只针对SPI口初始化
     GPIOA->CRL&=0X000FFFFF;
     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用     
     GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

  
     SPI1->CR1|=0<<10;//全双工模式 
     SPI1->CR1|=1<<9; //软件nss管理
     SPI1->CR1|=1<<8; 

     SPI1->CR1|=1<<2; //SPI主机
     SPI1->CR1|=0<<11;//8bit数据格式 
     SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
     SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 
     SPI1->CR1|=0<<3; //Fsck=Fcpu/256
     SPI1->CR1|=0<<7; //MSBfirst
 
     SPI1->CR2|=1<<6;      //接收缓冲区非空中断使能
     MY_NVIC_Init(1,0,SPI1_IRQChannel,4);  
  
     SPI1->CR1|=1<<6; //SPI设备使能
  
}  
//SPI 速度设置函数
//SpeedSet:
//SPI_SPEED_2   2分频   (SPI 12M    --sys 24M)
//SPI_SPEED_8   8分频   (SPI 3M     --sys 24M)
//SPI_SPEED_16  16分频  (SPI 1.5M    --sys 24M)
//SPI_SPEED_256 256分频 (SPI  905.6K --sys 24M)
void SPI1_SetSpeed(u8 SpeedSet)
{
         SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
     if(SpeedSet==SPI_SPEED_2)//二分频
     {
          SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz 
     }else if(SpeedSet==SPI_SPEED_8)//八分频
     {
          SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz 
     }else if(SpeedSet==SPI_SPEED_16)//十六分频
     {
          SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
     }

    else      //256分频
     {
          SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
     }
     SPI1->CR1|=1<<6; //SPI设备使能  
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{  
     u8 retry=0;    
     while((SPI1->SR&1<<1)==0)//等待发送区空 
     {
          retry++;
          if(retry>200)return 0;
     }    
     SPI1->DR=TxData;     //发送一个byte
     retry=0;
     while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
     {
          retry++;
          if(retry>200)return 0;
     }            
     return SPI1->DR;          //返回收到的数据       
}

u8 SPI1_ReadByte(u8 TxData)
{  
     u8 retry=0;    

      while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
     {
          retry++;
          if(retry>200)return 0;
     }            
     return SPI1->DR;          //返回收到的数据       
}


void SPI1_IRQHandler(void)

     if((SPI1->SR&1<<0)==1)
     { 
          Master_Temp = SPI1_ReadByte(0x00);
     }  
}

 

 

从机

#include "sys.h" //系统子函数
#include "usart.h"//串口子函数  
#include "delay.h" //延时子函数
 // SPI总线速度设置
#define SPI_SPEED_2   0
#define SPI_SPEED_8   1
#define SPI_SPEED_16  2
#define SPI_SPEED_256 3

u8 Slave_Temp=0;

void SPI1_Init(void);    //初始化SPI口
void SPI1_SetSpeed(u8 SpeedSet); //设置SPI速度  
u8 SPI1_ReadWriteByte(u8 TxData);

int main(void)
{
     Stm32_Clock_Init(3); //系统时钟设置
     delay_init(24);//延时函数初始化
     uart_init(24,9600); //串口初始化
     SPI1_Init(); //SPI1初始化
     SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频
     MY_NVIC_Init(0,0,SPI1_IRQChannel,4);   //设置抢占优先级为1,响应优先级为1,中断分组为4
     while(1)
     { 
            printf("Slave_Temp=%x\r\n",Slave_Temp);
              delay_ms(100); 
        }
}

//SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)

     RCC->APB2ENR|=1<<0; //复用
     RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
     RCC->APB2ENR|=1<<12;      //SPI1时钟使能
    
     //这里只针对SPI口初始化
     GPIOA->CRL&=0X000FFFFF;
     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用     
     GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

  
     SPI1->CR1|=0<<10;//全双工模式 
     SPI1->CR1|=1<<9; //软件nss管理
     SPI1->CR1|=0<<8;//ssi为0 

     SPI1->CR1|=0<<2; //SPI从机
     SPI1->CR1|=0<<11;//8bit数据格式 
     SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
     SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 
     SPI1->CR1|=0<<3; //Fsck=Fcpu/256
     SPI1->CR1|=0<<7; //MSBfirst
 
     SPI1->CR2|=1<<6;      //接收缓冲区非空中断使能
     MY_NVIC_Init(1,0,SPI1_IRQChannel,4);   
 
     SPI1->CR1|=1<<6; //SPI设备使能 
}  
//SPI 速度设置函数
//SpeedSet:
//SPI_SPEED_2   2分频   (SPI 12M    --sys 24M)
//SPI_SPEED_8   8分频   (SPI 3M     --sys 24M)
//SPI_SPEED_16  16分频  (SPI 1.5M    --sys 24M)
//SPI_SPEED_256 256分频 (SPI  905.6K --sys 24M)
void SPI1_SetSpeed(u8 SpeedSet)
{
     SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
     if(SpeedSet==SPI_SPEED_2)//二分频
     {
          SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz 
     }
     else if(SpeedSet==SPI_SPEED_8)//八分频
     {
          SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz 
     }
     else if(SpeedSet==SPI_SPEED_16)//十六分频
     {
          SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
     }
     else      //256分频
     {
          SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
     }
     SPI1->CR1|=1<<6; //SPI设备使能  
}


u8 SPI1_ReadWriteByte(u8 TxData)
{  
     u8 retry=0;    
     while((SPI1->SR&1<<1)==0)//等待发送区空 
     {
          retry++;
          if(retry>200)return 0;
     }    
     SPI1->DR=TxData;     //发送一个byte
     retry=0;
     while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
     {
          retry++;
          if(retry>200)return 0;
     }            
     return SPI1->DR;          //返回收到的数据       
}

u8 SPI1_ReadByte(u8 TxData)
{  
     u8 retry=0;    
 //   while((SPI1->SR&1<<1)==0)//等待发送区空 
  //   {
   //       retry++;
   //       if(retry>200)return 0;
  //   }    
   //  SPI1->DR=TxData;     //发送一个byte
   //  retry=0;
     while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
     {
          retry++;
          if(retry>200)return 0;
     }            
     return SPI1->DR;          //返回收到的数据       
}


void SPI1_IRQHandler(void)
{
      if((SPI1->SR&1<<0)==1)
     {     
          Slave_Temp = SPI1_ReadByte(0x00); 
          SPI1_ReadWriteByte(0xaa); 
     }  
}


改进:把主机改成查询接收也是可以的,这时只要一个发送,是真正意义上的全双工了。

主机:

#include "sys.h" //系统子函数
#include "usart.h"//串口子函数  
#include "delay.h" //延时子函数
#include "TIMER.h"

 // SPI总线速度设置
#define SPI_SPEED_2   0
#define SPI_SPEED_8   1
#define SPI_SPEED_16  2
#define SPI_SPEED_256 3

u8 Master_Temp =0;
void SPI1_Init(void);    //初始化SPI口
void SPI1_SetSpeed(u8 SpeedSet); //设置SPI速度  
void SPI1_WriteByte(u8 TxData);//SPI总线读写一个字节
u8 SPI1_ReadByte(u8 TxData);

int main(void)
{
 Stm32_Clock_Init(3); //系统时钟设置
 delay_init(24);//延时函数初始化
 uart_init(24,9600); //串口初始化
 SPI1_Init(); //SPI1初始化
 SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频
 

 while(1)
 { 
     SPI1_WriteByte(0x55);
  Master_Temp = SPI1_ReadByte(0x00);
  printf("Master_Temp =%x\r\n",Master_Temp);
  delay_ms(100); 
 }
}

//SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)

 RCC->APB2ENR|=1<<0; //复用
 RCC->APB2ENR|=1<<2;       //PORTA时钟使能  
 RCC->APB2ENR|=1<<12;      //SPI1时钟使能
    
 //这里只针对SPI口初始化
 GPIOA->CRL&=0X000FFFFF;
 GPIOA->CRL|=0XBBB00000;//PA5.6.7复用     
 GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

  
 SPI1->CR1|=0<<10;//全双工模式 
 SPI1->CR1|=1<<9; //软件nss管理
 SPI1->CR1|=1<<8; 

 SPI1->CR1|=1<<2; //SPI主机
 SPI1->CR1|=0<<11;//8bit数据格式 
 SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
 SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1 
 SPI1->CR1|=0<<3; //Fsck=Fcpu/256
 SPI1->CR1|=0<<7; //MSBfirst
 
 //SPI1->CR2|=1<<6;      //接收缓冲区非空中断使能
 //MY_NVIC_Init(8,0,SPI1_IRQChannel,4);  
  
 SPI1->CR1|=1<<6; //SPI设备使能
  
}  
//SPI 速度设置函数

void SPI1_SetSpeed(u8 SpeedSet)
{
 SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
 if(SpeedSet==SPI_SPEED_2)//二分频
 {
  SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz 
 }else if(SpeedSet==SPI_SPEED_8)//八分频
 {
  SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz 
 }else if(SpeedSet==SPI_SPEED_16)//十六分频
 {
  SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
 }else      //256分频
 {
  SPI1->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz 低速模式
 }
 SPI1->CR1|=1<<6; //SPI设备使能  
}
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
void SPI1_WriteByte(u8 TxData)
{  
 u8 retry=0;    
 while((SPI1->SR&1<<1)==0)//等待发送区空 
 {
  retry++;
  if(retry>200)return;
 }    
 SPI1->DR=TxData;     //发送一个byte       
}

u8 SPI1_ReadByte(u8 TxData)
{  
 u8 retry=0;    

 while((SPI1->SR&1<<0)==0) //等待接收完一个byte 
 {
  retry++;
  if(retry>200)return 0;
 }            
 return SPI1->DR;          //返回收到的数据       
}

 

 

 

 

 


                    

 

STM32 SPI双机通信.rar

119.95 KB, 下载次数: 12724

?成功只是最后一小步的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-10-22 14:41:31 | 显示全部楼层
连线:主机 SCK<-> SCK 从机

                           MISO <-> MISO

                            MOSI<-> MOSI
这个不对吧,应该输入接输出。输出接输入。哥。。。。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 0 反对 9

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2013-11-15
在线时间
4 小时
发表于 2013-11-15 11:07:20 | 显示全部楼层

回复【24楼】750273008:
---------------------------------
你可知道MOSI MISO是什么意思?
MOSI:主发从收
当SPI配置为主机时该端口就为发送(Master Output),当配置为从机时该端口就为接收(Slave Input)

MISO:主收从发
当SPI配置为主机时该端口就为接收(Master Input),当配置为从机时该端口就为发送(Slave Output)

也就是说如我括号所括的是端口的实际功能,不是说主机是(MI) 从机也是(MI),M是Master(主)  S是Slave(从)
 MISO是一个端口有两种模式MI和SO可选,但是一个端口不能同时配符合两种模式,要么是MI要么是SO               

                  主机 SCK<-> SCK 从机 
                (MI)SO <-> MI(SO) 
                 (MO)SI<-> MO(SI)

主机的MI是连着从机的SO,,主机的MO是连着从机的SI,也就是你所说的输入对输出 ,输出对输入。可明白????
            

回复 支持 3 反对 0

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-8-9 14:02:11 | 显示全部楼层
这个ST官方有代码的。将一个STm32的SPi1和SPi2连接
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : main.c
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : Main program body
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"

/* Local includes ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
#define BufferSize 32

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
SPI_InitTypeDef   SPI_InitStructure;
u8 SPI1_Buffer_Tx[BufferSize] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
                                 0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
                                 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
                                 0x1C,0x1D,0x1E,0x1F,0x20};
u8 SPI2_Buffer_Tx[BufferSize] = {0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
                                 0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,
                                 0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,
                                 0x6C,0x6D,0x6E,0x6F,0x70};
u8 SPI1_Buffer_Rx[BufferSize], SPI2_Buffer_Rx[BufferSize];
u8 Tx_Idx = 0, Rx_Idx = 0, k = 0;
volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;
volatile TestStatus TransferStatus3 = FAILED, TransferStatus4 = FAILED;
ErrorStatus HSEStartUpStatus;

/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  /* 1st phase: SPI1 Master and SPI2 Slave */
  /* SPI1 Config -------------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* SPI2 Config -------------------------------------------------------------*/
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);
  /* Enable SPI2 */
  SPI_Cmd(SPI2, ENABLE);

  /* Transfer procedure */
  while(Tx_Idx<BufferSize)
  {
    /* Wait for SPI1 Tx buffer empty */
    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE)==RESET);
    /* Send SPI2 data */
    SPI_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]);       
    /* Send SPI1 data */
    SPI_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx++]);     
    /* Wait for SPI2 data reception */
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE)==RESET);
    /* Read SPI2 received data */
    SPI2_Buffer_Rx[Rx_Idx] = SPI_ReceiveData(SPI2);
    /* Wait for SPI1 data reception */
    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE)==RESET);
    /* Read SPI1 received data */
    SPI1_Buffer_Rx[Rx_Idx++] = SPI_ReceiveData(SPI1);                 
  }

  /* Check the corectness of written dada */
  TransferStatus1 = Buffercmp(SPI2_Buffer_Rx, SPI1_Buffer_Tx, BufferSize);
  TransferStatus2 = Buffercmp(SPI1_Buffer_Rx, SPI2_Buffer_Tx, BufferSize);
  /* TransferStatus1, TransferStatus2 = PASSED, if the transmitted and received data
     are equal */
  /* TransferStatus1, TransferStatus2 = FAILED, if the transmitted and received data
     are different */

  /* 2nd phase: SPI1 Slave and SPI2 Master */  
  /* SPI1 Re-configuration ---------------------------------------------------*/
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* SPI2 Re-configuration ---------------------------------------------------*/
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* Reset Tx_Idx, Rx_Idx indexes and receive tables values */
  Tx_Idx=0;
  Rx_Idx=0;
  for(k=0; k<BufferSize; k++)  SPI2_Buffer_Rx[k]=0;
  for(k=0; k<BufferSize; k++)  SPI1_Buffer_Rx[k]=0;

  /* Transfer procedure */
  while(Tx_Idx<BufferSize)
  {
    /* Wait for SPI2 Tx buffer empty */
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_TXE)==RESET);
    /* Send SPI1 data */
    SPI_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx]);
    /* Send SPI2 data */
    SPI_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx++]);
    /* Wait for SPI1 data reception */
    while(SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE)==RESET);
    /* Read SPI1 received data */
    SPI1_Buffer_Rx[Rx_Idx] = SPI_ReceiveData(SPI1);
    /* Wait for SPI2 data reception */
    while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE)==RESET);
    /* Read SPI2 received data */
    SPI2_Buffer_Rx[Rx_Idx++] = SPI_ReceiveData(SPI2);
  }

  /* Check the corectness of written dada */
  TransferStatus3 = Buffercmp(SPI2_Buffer_Rx, SPI1_Buffer_Tx, BufferSize);
  TransferStatus4 = Buffercmp(SPI1_Buffer_Rx, SPI2_Buffer_Tx, BufferSize);
  /* TransferStatus3, TransferStatus4 = PASSED, if the transmitted and received data
     are equal */
  /* TransferStatus3, TransferStatus4 = FAILED, if the transmitted and received data
     are different */

  while (1)
  {
  }
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK/2 */
    RCC_PCLK2Config(RCC_HCLK_Div2);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

/* Enable peripheral clocks --------------------------------------------------*/
  /* GPIOA, GPIOB and SPI1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_SPI1, ENABLE);
  /* SPI2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure SPI1 pins: SCK, MISO and MOSI ---------------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure SPI2 pins: SCK, MISO and MOSI ---------------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures NVIC and Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
}

/*******************************************************************************
* Function Name  : Buffercmp
* Description    : Compares two buffers.
* Input          : - pBuffer1, pBuffer2: buffers to be compared.
*                : - BufferLength: buffer's length
* Output         : None
* Return         : PASSED: pBuffer1 identical to pBuffer2
*                  FAILED: pBuffer1 differs from pBuffer2
*******************************************************************************/
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength)
{
  while(BufferLength--)
  {
    if(*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }
   
    pBuffer1++;
    pBuffer2++;
  }

  return PASSED;  
}

#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
回复 支持 1 反对 0

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-1-8
在线时间
0 小时
发表于 2015-1-8 20:34:22 | 显示全部楼层
感谢一楼原创!按您的程序调试通过了。做了点小修改,如下,在我这测试通过了,欢迎大家测试:
1.发送端可以不用使能中断
2.主从机的spi的时钟可以设置到9MHz(更高的没有试验)
2.接收端:改成每次接收spi1_rec_buf_MAX
void SPI1_IRQHandler(void)
{
if((SPI1->SR&1<<0)==1) 
{
spi1_rec_buf[rec_cnt++] = SPI1_ReadByte(0x00);
//SPI1_ReadWriteByte(0xaa);//如果不注释掉会丢掉1半的数
if(rec_cnt>=spi1_rec_buf_MAX)
{
  spi1_rec_flag=1;
  rec_cnt=0;
}
}
}
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-22 20:10:58 | 显示全部楼层
suqingxiao 轻易不发帖,一发帖就是好贴啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 0 反对 1

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-7-22 14:43:08 | 显示全部楼层
我靠,mark...
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2013-7-22 15:15:23 | 显示全部楼层
正在研究这个问题 果然是想睡觉马上有人送枕头 感觉太好了

谢谢老哥的枕头。非常感激

再次感谢楼主!

另 请教一下,    多个stm32 如何通过spi传输数据  就是 一主机带多从机    我如何分辨要发送那个从机呢?

每一个从机 加一个 cs 信号?
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2013-7-22 15:36:46 | 显示全部楼层
加个CS片选就可以了。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2013-7-22 16:09:04 | 显示全部楼层
以前自己写的没调试好,数据错位。这个不错
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2013-7-22 17:02:12 | 显示全部楼层
最初的版本有些问题,是我打包的时候做了一些修改没有测试就发布,后来测试发现主机不能正常收到数据,主要是从机接收程序的问题,不管是主机还是从机,接收不能和发送放在同一个函数中。欢迎大家去测试。有问题大家一起都来到来讨论。我自己花了两天时间测试出来的,会有很多不完善的地方。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

8

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2012-4-18
在线时间
76 小时
发表于 2013-7-22 17:28:14 | 显示全部楼层
mark.............必须的
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-7-22 18:35:38 | 显示全部楼层
顶,    只要是开源或者原创.   都要给与掌声感谢的 !!
回复 支持 反对

使用道具 举报

5

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2010-12-16
在线时间
28 小时
发表于 2013-7-22 22:24:54 | 显示全部楼层
果然强,先收藏着!!!
回复 支持 反对

使用道具 举报

5

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2012-7-28
在线时间
6 小时
发表于 2013-7-24 08:35:25 | 显示全部楼层
感谢分享。。
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-7-24 11:01:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-4-30
在线时间
1 小时
发表于 2013-8-5 22:45:44 | 显示全部楼层
好东西!!!
回复 支持 反对

使用道具 举报

9

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-3-28
在线时间
64 小时
发表于 2013-8-6 14:59:21 | 显示全部楼层
留个爪印,以备后用!楼主好人啊!
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-8-6
在线时间
0 小时
发表于 2013-8-23 09:30:18 | 显示全部楼层
好贴,顶一个
回复 支持 反对

使用道具 举报

7

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-18
在线时间
0 小时
发表于 2013-8-23 09:52:44 | 显示全部楼层
好!!收藏了。。
只求每天都能把小事做好。
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-8-23 14:25:00 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
楼主,看到你对SPI有研究真是太好了,我最近也在学SPI,不过我现在用的是SPI的单线双向模式,一个STM32做主,一个做从,请问你有没有做过,想讨个 程序。。
回复 支持 反对

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2013-8-11
在线时间
0 小时
发表于 2013-8-25 22:35:58 | 显示全部楼层
Stm32_Clock_Init(3); //系统时钟设置,,,,楼主为什么这个地方是3不是9
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-7-30
在线时间
0 小时
发表于 2013-8-26 17:32:39 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
    //这里只针对SPI口初始化
     GPIOA->CRL&=0X000FFFFF; 
     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用      
     GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉
 
以上 A6是MISO在主模式里不是应该配成浮空或上拉输入吗。。

另外复用输出配置上拉不是没用吗。。

在别的帖子里看到回答了。嗯 soga

回复 支持 反对

使用道具 举报

19

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2012-11-18
在线时间
72 小时
发表于 2013-9-16 13:54:48 | 显示全部楼层
"做主机时会控制通信的时钟,从机是不能产生时钟的"
为什么从机的配置要加上SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频?
求解.
回复 支持 反对

使用道具 举报

19

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2012-11-18
在线时间
72 小时
发表于 2013-9-23 11:13:45 | 显示全部楼层
回复【20楼】lansing1648:

"做主机时会控制通信的时钟,从机是不能产生时钟的"
为什么从机的配置要加上SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频?
求解.

---------------------------------
自己顶
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-7-28
在线时间
0 小时
发表于 2013-9-23 15:49:59 | 显示全部楼层
mark一个,我有弄过spi,发现速度不是很理想就没继续弄了 
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-10-2
在线时间
0 小时
发表于 2013-10-21 23:48:35 | 显示全部楼层
刚要睡觉、、看到此贴、、马上来精神了!赞一个!
回复 支持 反对

使用道具 举报

23

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-11-3 16:12:25 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

23

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-11-4 18:46:59 | 显示全部楼层
回复【6楼】suqingxiao:
---------------------------------
不管是主机还是从机,接收不能和发送放在同一个函数中,
为什么不可以,不理解
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-11-15 11:37:10 | 显示全部楼层
SPI接口是全双工的,但通信协议基本上半双工的。因为从机不能主动发送数据。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-10-14
在线时间
0 小时
发表于 2013-11-21 10:23:49 | 显示全部楼层
回复【3楼】simms01:
正在研究这个问题 果然是想睡觉马上有人送枕头 感觉太好了谢谢老哥的枕头。非常感激再次感谢楼主!另 请教一下,    多个stm32 如何通过spi传输数据  就是 一主机带多从机    我如何分辨要发送那个从机呢?每一个从机 加一个 cs 信号?
---------------------------------
回复【4楼】suqingxiao:
加个CS片选就可以了。
---------------------------------
我想问下,一主多从的话,加个CS片选,从机的片选在主机上是怎么接的?从机的NSS设置怎么做的? 是通过GPIO端口控制多个从机么?要和哪个从机通信就通过GPIO口使对应的从机片选拉低来选中么?
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-30 02:41:29 | 显示全部楼层
回复【27楼】wodefans7:
---------------------------------
赞 解决了我一个问题
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-30 02:42:17 | 显示全部楼层
回复【28楼】styleno1:
---------------------------------
所以 数据环流罗
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-12-3
在线时间
0 小时
发表于 2013-12-3 14:37:26 | 显示全部楼层
全双工 感谢楼主分享的好贴
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-3-17
在线时间
1 小时
发表于 2014-3-17 21:11:04 | 显示全部楼层
。。
回复 支持 反对

使用道具 举报

头像被屏蔽

254

主题

304

帖子

0

精华

禁止发言

积分
1006
金钱
1006
注册时间
2012-4-13
在线时间
32 小时
发表于 2014-3-18 14:00:27 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
谢谢分享
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-4-14 19:41:34 | 显示全部楼层
多谢分享~~
回复 支持 反对

使用道具 举报

13

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-8-27
在线时间
12 小时
发表于 2014-4-14 22:43:32 | 显示全部楼层
mark,快要用到这个了,还想着好好研究一番,这下有的参考了
回复 支持 反对

使用道具 举报

19

主题

90

帖子

1

精华

高级会员

Rank: 4

积分
543
金钱
543
注册时间
2012-5-13
在线时间
40 小时
发表于 2014-4-22 13:03:31 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
赞一个,强悍。学习了。
回复 支持 反对

使用道具 举报

12

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-9-4
在线时间
8 小时
发表于 2014-5-5 12:10:07 | 显示全部楼层
回复【6楼】suqingxiao:
---------------------------------
用楼主提供的方法我成功实现了主从机通讯,同时也测试了楼主所说的:“还有一点要注意的,做主机接收时,不能和发送共用一个函数。这个为什么我自己现在也没有清楚,只是在实验中测得。 ”我也做了实验,发送与接收之间速度太快了,从机反应不过来,在发送与接收之间加一个延时(我加的1ms),就可以共用一个函数了。
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-5-5 12:37:04 | 显示全部楼层
标识清除,绝对要顶,马上要用。
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-28 15:43:05 | 显示全部楼层
回复【4楼】suqingxiao:
---------------------------------
从机不能主动发数据?
可是我做的测试,从机先发数据,主机跟在后面发,同样好使的啊。我的SPI2是从机,SPI1是主机,结果可以正常通信,求大神解释
/* SPI2 发送数据 */ 
SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]);
/* SPI1 发送数据 */  
SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx++]);
愈挫愈勇
回复 支持 反对

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2014-5-28
在线时间
0 小时
发表于 2014-5-29 09:16:00 | 显示全部楼层
请教一个问题哈,就是使用stm32的三个硬件spi,全是主机模式,这三个spi口都是独立工作的吗?时钟也都是独立的吧?
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-11-25
在线时间
0 小时
发表于 2014-6-2 22:23:35 | 显示全部楼层
问楼主一个问题,如果两个芯片的spi所在的地址映射是不一样的,比如一个基地址是0x40003800一个基地址是0x40003000,他们还可以通过spi直接传送数据吗(小弟急求,谢谢了)
回复 支持 反对

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
发表于 2014-8-6 20:19:38 | 显示全部楼层
楼主能不能给一个联系的方式,比如:QQ  等等,有一些2个STM32  使用SPI通信的问题需要咨询你一下。我的程序也是主机接受不到数据!!!!
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-6
在线时间
2 小时
发表于 2014-8-29 14:45:27 | 显示全部楼层
mark
说不定马上就用到
回复 支持 反对

使用道具 举报

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-4-24
在线时间
6 小时
发表于 2014-9-10 09:20:50 | 显示全部楼层
目前正在研究这个,希望能对我有用
回复 支持 反对

使用道具 举报

18

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-4-24
在线时间
6 小时
发表于 2014-9-11 11:04:44 | 显示全部楼层
我的程序按照你的代码写的,主机发送一个0X78,从机收到0x78后,加1再发回给主机,但是主机收到的数据有时候是0x78,有时候是0x80,有时候是0x79,不知道问题出在哪里啊?

SPI主从通信.rar

12.55 MB, 下载次数: 10211

回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2014-3-16
在线时间
9 小时
发表于 2014-9-11 11:27:50 | 显示全部楼层
赞一个,楼主强大
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2014-10-24 17:58:48 | 显示全部楼层
cool~~~~
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2014-10-24 21:46:48 | 显示全部楼层
关注一下。肯定会用到的
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-9-4
在线时间
0 小时
发表于 2014-10-26 18:45:47 | 显示全部楼层
这个通信的时候还是乱码,都是0xff
爱生活爱自己喵~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 15:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表