STM32如何配置使用SPI串口通信配置

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(18400)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'stm32 f103c8t6 spi1 spi2对接 主从模式使用心得及要点 经调试成功的代码',
blogAbstract:'
tag:stm32 c8t6 spi 主从 ssoe ssi ssm nss 无法接收 gpio配置 0x00 0xff
经过两天的调试
终于调通stm32 spi1 spi2对接主从模式数据传送,下面总结一下,看到这文章的人也可以少走弯路
我用的是最小系统版+万用板手工焊接的
spi2为主机 spi1为从机
首先我们要打开spi1 spi2 以及gpioa gpiob的时钟:
&&&&& RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟&&&&& RCC_',
blogTag:'stm32,c8t6,spi,主从',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:9,
permalink:'blog/static/',
commentCount:8,
mainCommentCount:3,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}&>&STM32-SPI通信原理及编程步骤
STM32-SPI通信原理及编程步骤
上传大小:356KB
STM32-SPI通信原理及编程步骤;STM32-SPI通信原理及编程步骤
综合评分:0
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
STM32-SPI通信原理及编程步骤
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
STM32-SPI通信原理及编程步骤下次自動登錄
現在的位置:
& 綜合 & 正文
STM32 SPI初始化和使用
串列外設介面(SPI)。初始化步驟:1、連接SPI外設時鐘,通過RCC-&APB2ENR設置。2、連接被複用的GPIO的外設時鐘,也是通過RCC-&APB2ENR設置為什麼還要連接GPIO時鐘,參見STM32參考手冊8.1.4節。手冊上這麼說的:對於復用輸出功能,埠必須配置成復用功能輸出模式(推挽或開漏)。3、設置被複用的GPIO為推挽輸出,並設置時鐘。不能設置為開漏輸出。設置成開漏輸出時,示波器上看輸出是鋸齒波,而不是需要的方波。4、通過配置SPIx-&CR1來設置SPI 的工作模式。最後使能SPI5、收發數據。收發數據可以使用同一個函數,因為SPI是同步輸入輸出的,在發送數據的時候已經在接受數據。配置SPI1代碼如下:
void SPI1_Init(void)
RCC-&APB2ENR |= 1&&12;//使能SPI1 時鐘
RCC-&APB2ENR |= 1&&2;
//配置服用功能輸出
GPIOA-&CRL&=0X000FFFFF;
GPIOA-&CRL|=0XBBB00000;//PA5.6.7 復用,推挽輸出 50M時鐘 (不能配置成開漏,否則輸出為鋸齒波)
GPIOA-&ODR|=0X7&&5;
SPI1-&CR1|=0&&11;//8bit數據格式
SPI1-&CR1|=0&&10;//全雙工模式
SPI1-&CR1|=1&&9; //軟體nss 管理
SPI1-&CR1|=1&&8;
SPI1-&CR1|=0&&7; //MSBfirst
SPI1-&CR1|=7&&3; //設置時鐘Fsck=Fcpu/256
SPI1-&CR1|=1&&2; //SPI 主機
SPI1-&CR1|=1&&1; //空閑模式下 SCK為 1 CPOL=1
SPI1-&CR1|=1&&0; //數據採樣從第二個時間邊沿開始
SPI1-&CR1|=1&&6; //使能
現在可以讀寫數據了:
u8 SPI1_ReadWriteByte(u8 data)
//while((SPI1-&SR && 1&&7) == 0);
//等待SPI1空閑
while((SPI1-&SR && 1&&1)==0);
//等待發送緩衝區空
SPI1-&DR =
while((SPI1-&SR && 1&&0)==0);
return SPI1-&DR;
Technorati 標籤: ,,
【上篇】【下篇】查看: 107143|回复: 126
STM32 SPI双机通信(主从全双工),绝对原创,申请酷帖
主题帖子精华
高级会员, 积分 509, 距离下一级还需 491 积分
在线时间0 小时
个人心得:在做主从双机通信时,一定要理解好主机和从机的作用,做主机时会控制通信的时钟,从机是不能产生时钟的。如果从机要发送数据,那可以在主机发送数据 的时钟上发送数据。配置上差不多是一样的,就设计主从就得了。我这里接收都是用中断。
还有一点要注意的,做主机接收时,不能和发送共用一个函数。这个为什么我自己现在也没有清楚,只是在实验中测得。&
&纠错:从机的接收函数改成,这时因为我测试完成后有改动就压包,后来测试发现主机不能正常接收到数据
更正:我之前的两个时钟的理论是不合理的,因为全双工收发是可以共用时钟的,这个我在后面改进的主机程序中有体现。
欢迎大家测试
u8 SPI1_ReadByte(u8 TxData)
&u8 retry=0;&&&&
//&while((SPI1-&SR&1&&1)==0)//等待发送区空&
//&&retry++;
//&&if(retry&200)return 0;
//&SPI1-&DR=TxD& && //发送一个byte
&while((SPI1-&SR&1&&0)==0) //等待接收完一个byte&
&&retry++;
&&if(retry&200)return 0;
&}&& &&&&&&&&&
&return SPI1-&DR;&&&&&&&&& //返回收到的数据&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
工具:STM32 MINI板两块
STM32 SPI说明:
注意: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=TxD& && //发送一个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=TxD& && //发送一个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=TxD& && //发送一个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速度两分频
&&& &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)
&SPI1-&DR=TxD& && //发送一个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;&&&&&&&&& //返回收到的数据&&&&&&&
&&&&&&&&&&&&&&&&&&&&
16:52 上传
点击文件名下载附件
119.95 KB, 下载次数: 8032
?成功只是最后一小步的坚持!
主题帖子精华
金牌会员, 积分 1286, 距离下一级还需 1714 积分
在线时间20 小时
连线:主机&SCK&-&&SCK&从机
&&&&&&&&&&&&&&&&&&&&&&&&&&&MISO&&-&&MISO
&&&&&&&&&&&&&&&&&&&&&&&&&&&&MOSI&-&&MOSI
这个不对吧,应该输入接输出。输出接输入。哥。。。。
QQ有好的资料记得发给我哦。。。
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
回复【24楼】:
---------------------------------
你可知道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,也就是你所说的输入对输出 ,输出对输入。可明白????
&&&&&&&&&&&&
主题帖子精华
金钱126779
在线时间1099 小时
suqingxiao&轻易不发帖,一发帖就是好贴啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
头像被屏蔽
主题帖子精华
在线时间23 小时
我靠,mark...
主题帖子精华
金牌会员, 积分 1298, 距离下一级还需 1702 积分
在线时间92 小时
正在研究这个问题 果然是想睡觉马上有人送枕头 感觉太好了
谢谢老哥的枕头。非常感激
再次感谢楼主!
另 请教一下, & &多个stm32 如何通过spi传输数据 &就是 一主机带多从机 & &我如何分辨要发送那个从机呢?
每一个从机 加一个 cs 信号?
主题帖子精华
高级会员, 积分 509, 距离下一级还需 491 积分
在线时间0 小时
加个CS片选就可以了。
?成功只是最后一小步的坚持!
主题帖子精华
金牌会员, 积分 1103, 距离下一级还需 1897 积分
在线时间38 小时
以前自己写的没调试好,数据错位。这个不错
主题帖子精华
高级会员, 积分 509, 距离下一级还需 491 积分
在线时间0 小时
最初的版本有些问题,是我打包的时候做了一些修改没有测试就发布,后来测试发现主机不能正常收到数据,主要是从机接收程序的问题,不管是主机还是从机,接收不能和发送放在同一个函数中。欢迎大家去测试。有问题大家一起都来到来讨论。我自己花了两天时间测试出来的,会有很多不完善的地方。
?成功只是最后一小步的坚持!
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间0 小时
mark.............必须的
主题帖子精华
初级会员, 积分 158, 距离下一级还需 42 积分
在线时间1 小时
顶,&&&&只要是开源或者原创.&&&都要给与掌声感谢的&!!
主题帖子精华
初级会员, 积分 186, 距离下一级还需 14 积分
在线时间17 小时
果然强,先收藏着!!!
主题帖子精华
初级会员, 积分 120, 距离下一级还需 80 积分
在线时间5 小时
感谢分享。。
主题帖子精华
初级会员, 积分 91, 距离下一级还需 109 积分
在线时间0 小时
主题帖子精华
新手上路, 积分 42, 距离下一级还需 8 积分
在线时间0 小时
好东西!!!
主题帖子精华
中级会员, 积分 386, 距离下一级还需 114 积分
在线时间33 小时
留个爪印,以备后用!楼主好人啊!
主题帖子精华
新手入门, 积分 46, 距离下一级还需 -26 积分
在线时间0 小时
好贴,顶一个
主题帖子精华
中级会员, 积分 213, 距离下一级还需 287 积分
在线时间0 小时
好!!收藏了。。
只求每天都能把小事做好。
主题帖子精华
中级会员, 积分 312, 距离下一级还需 188 积分
在线时间0 小时
回复【楼主位】suqingxiao:
---------------------------------
楼主,看到你对SPI有研究真是太好了,我最近也在学SPI,不过我现在用的是SPI的单线双向模式,一个STM32做主,一个做从,请问你有没有做过,想讨个&程序。。
主题帖子精华
初级会员, 积分 86, 距离下一级还需 114 积分
在线时间0 小时
Stm32_Clock_Init(3);&//系统时钟设置,,,,楼主为什么这个地方是3不是9
主题帖子精华
新手入门, 积分 49, 距离下一级还需 -29 积分
在线时间0 小时
回复【9楼】正点原子:
---------------------------------
&&&&//这里只针对SPI口初始化
&&&&&GPIOA-&CRL&=0X000FFFFF;&
&&&&&GPIOA-&CRL|=0XBBB00000;//PA5.6.7复用&&&&&&
&&&&&GPIOA-&ODR|=0X7&&5;&&&&//PA5.6.7上拉
以上&nbspA6是MISO在主模式里不是应该配成浮空或上拉输入吗。。
另外复用输出配置上拉不是没用吗。。
在别的帖子里看到回答了。嗯 soga
主题帖子精华
中级会员, 积分 396, 距离下一级还需 104 积分
在线时间34 小时
"做主机时会控制通信的时钟,从机是不能产生时钟的"
为什么从机的配置要加上SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频?
求解.
主题帖子精华
中级会员, 积分 396, 距离下一级还需 104 积分
在线时间34 小时
回复【20楼】lansing1648:
"做主机时会控制通信的时钟,从机是不能产生时钟的"
为什么从机的配置要加上SPI1_SetSpeed(SPI_SPEED_256);//SPI速度两分频?
求解.
---------------------------------
自己顶
主题帖子精华
新手入门, 积分 50, 距离下一级还需 -30 积分
在线时间0 小时
mark一个,我有弄过spi,发现速度不是很理想就没继续弄了&
主题帖子精华
初级会员, 积分 53, 距离下一级还需 147 积分
在线时间0 小时
刚要睡觉、、看到此贴、、马上来精神了!赞一个!
主题帖子精华
初级会员, 积分 173, 距离下一级还需 27 积分
在线时间0 小时
主题帖子精华
初级会员, 积分 173, 距离下一级还需 27 积分
在线时间0 小时
回复【6楼】suqingxiao:
---------------------------------
不管是主机还是从机,接收不能和发送放在同一个函数中,
为什么不可以,不理解
主题帖子精华
在线时间0 小时
SPI接口是全双工的,但通信协议基本上半双工的。因为从机不能主动发送数据。
于停用该账号:http://www.microstar.club
主题帖子精华
初级会员, 积分 85, 距离下一级还需 115 积分
在线时间0 小时
回复【3楼】simms01:
正在研究这个问题&果然是想睡觉马上有人送枕头&感觉太好了谢谢老哥的枕头。非常感激再次感谢楼主!另&请教一下,&&&&多个stm32&如何通过spi传输数据&&就是&一主机带多从机&&&&我如何分辨要发送那个从机呢?每一个从机&加一个&cs&信号?
---------------------------------
回复【4楼】suqingxiao:
加个CS片选就可以了。
---------------------------------
我想问下,一主多从的话,加个CS片选,从机的片选在主机上是怎么接的?从机的NSS设置怎么做的?&是通过GPIO端口控制多个从机么?要和哪个从机通信就通过GPIO口使对应的从机片选拉低来选中么?
主题帖子精华
中级会员, 积分 468, 距离下一级还需 32 积分
在线时间9 小时
回复【27楼】wodefans7:
---------------------------------
赞&解决了我一个问题
闷鱼闷闷不乐吃焖鱼
主题帖子精华
中级会员, 积分 468, 距离下一级还需 32 积分
在线时间9 小时
回复【28楼】styleno1:
---------------------------------
所以&数据环流罗
闷鱼闷闷不乐吃焖鱼
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
全双工&感谢楼主分享的好贴
主题帖子精华
新手入门, 积分 26, 距离下一级还需 -6 积分
在线时间1 小时
头像被屏蔽
主题帖子精华
在线时间32 小时
回复【楼主位】suqingxiao:
---------------------------------
谢谢分享
主题帖子精华
初级会员, 积分 86, 距离下一级还需 114 积分
在线时间0 小时
多谢分享~~
主题帖子精华
初级会员, 积分 136, 距离下一级还需 64 积分
在线时间5 小时
mark,快要用到这个了,还想着好好研究一番,这下有的参考了
主题帖子精华
中级会员, 积分 406, 距离下一级还需 94 积分
在线时间17 小时
回复【楼主位】suqingxiao:
---------------------------------
赞一个,强悍。学习了。
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间7 小时
回复【6楼】suqingxiao:
---------------------------------
用楼主提供的方法我成功实现了主从机通讯,同时也测试了楼主所说的:“还有一点要注意的,做主机接收时,不能和发送共用一个函数。这个为什么我自己现在也没有清楚,只是在实验中测得。&”我也做了实验,发送与接收之间速度太快了,从机反应不过来,在发送与接收之间加一个延时(我加的1ms),就可以共用一个函数了。
主题帖子精华
中级会员, 积分 277, 距离下一级还需 223 积分
在线时间3 小时
标识清除,绝对要顶,马上要用。
大海啊,全是水;
骏马啊,四条腿。
主题帖子精华
中级会员, 积分 259, 距离下一级还需 241 积分
在线时间0 小时
回复【4楼】suqingxiao:
---------------------------------
从机不能主动发数据?
可是我做的测试,从机先发数据,主机跟在后面发,同样好使的啊。我的SPI2是从机,SPI1是主机,结果可以正常通信,求大神解释
/*&SPI2&发送数据&*/&
SPI_I2S_SendData(SPI2,&SPI2_Buffer_Tx[Tx_Idx]);
/*&SPI1&发送数据&*/&&
SPI_I2S_SendData(SPI1,&SPI1_Buffer_Tx[Tx_Idx++]);
主题帖子精华
初级会员, 积分 107, 距离下一级还需 93 积分
在线时间0 小时
请教一个问题哈,就是使用stm32的三个硬件spi,全是主机模式,这三个spi口都是独立工作的吗?时钟也都是独立的吧?
主题帖子精华
新手入门, 积分 39, 距离下一级还需 -19 积分
在线时间0 小时
问楼主一个问题,如果两个芯片的spi所在的地址映射是不一样的,比如一个基地址是0x一个基地址是0x,他们还可以通过spi直接传送数据吗(小弟急求,谢谢了)
主题帖子精华
中级会员, 积分 446, 距离下一级还需 54 积分
在线时间53 小时
楼主能不能给一个联系的方式,比如:QQ &等等,有一些2个STM32 &使用SPI通信的问题需要咨询你一下。我的程序也是主机接受不到数据!!!!
主题帖子精华
新手上路, 积分 44, 距离下一级还需 6 积分
在线时间2 小时
mark
说不定马上就用到
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间2 小时
目前正在研究这个,希望能对我有用
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间2 小时
我的程序按照你的代码写的,主机发送一个0X78,从机收到0x78后,加1再发回给主机,但是主机收到的数据有时候是0x78,有时候是0x80,有时候是0x79,不知道问题出在哪里啊?
11:04 上传
点击文件名下载附件
12.55 MB, 下载次数: 6514
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间8 小时
赞一个,楼主强大
主题帖子精华
在线时间1071 小时
主题帖子精华
初级会员, 积分 149, 距离下一级还需 51 积分
在线时间9 小时
关注一下。肯定会用到的
主题帖子精华
新手入门, 积分 32, 距离下一级还需 -12 积分
在线时间0 小时
这个通信的时候还是乱码,都是0xff
爱生活爱自己喵~
Powered by

我要回帖

更多关于 cubemx can通信配置 的文章

 

随机推荐