OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 88698|回复: 122

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

  [复制链接]

  离线 

20

主题

108

帖子

2

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2011-10-18
在线时间
0 小时
发表于 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, 下载次数: 7083

?成功只是最后一小步的坚持!
回复

使用道具 举报

  离线 

49

主题

348

帖子

4

精华

金牌会员

Rank: 6Rank: 6

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

                           MISO <-> MISO

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

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
26
金钱
26
注册时间
2013-11-15
在线时间
3 小时
发表于 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,也就是你所说的输入对输出 ,输出对输入。可明白????
            

回复 支持 2 反对 0

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

24

主题

904

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

  离线 

100

主题

662

帖子

0

精华

高级会员

Rank: 4

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

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

再次感谢楼主!

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

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

使用道具 举报

  离线 

20

主题

108

帖子

2

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

17

主题

359

帖子

1

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

20

主题

108

帖子

2

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

7

主题

33

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

4

主题

118

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

5

主题

95

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

5

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2012-7-28
在线时间
4 小时
发表于 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

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

6

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

2

主题

18

帖子

0

精华

新手上路

Rank: 1

积分
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

精华

新手上路

Rank: 1

积分
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

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

19

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

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

使用道具 举报

  离线 

4

主题

14

帖子

0

精华

新手上路

Rank: 1

积分
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

主题

1502

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1651
金钱
1651
注册时间
2013-7-24
在线时间
0 小时
发表于 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

主题

287

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

23

主题

287

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

37

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2012-4-13
在线时间
27 小时
发表于 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

主题

41

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

19

主题

81

帖子

1

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

12

主题

29

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

12

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2014-4-9
在线时间
3 小时
发表于 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

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

使用道具 举报

  离线 

2

主题

11

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

22

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

0

主题

6

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

18

主题

60

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

18

主题

60

帖子

0

精华

初级会员

Rank: 2

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

SPI主从通信.rar

12.55 MB, 下载次数: 5607

回复 支持 反对

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

55

主题

4418

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

  离线 

9

主题

73

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

2

主题

4

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-22 07:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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