历史上的今天
返回首页

历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2018年09月12日 | SPI通信(SPI1主机与SPI2从机)

2018-09-12 来源:eefocus

芯片型号stm32f103


主机采用spi1,从机spi2,中断接收测试


主机配置函数:


#include "spi.h"

void SPI1_Init(void)

{    

    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

    SPI_InitTypeDef  SPI_InitStructure;

    

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //ʹÄÜPA¶Ë¿ÚʱÖÓ

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,   ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //ÍÆÍìÊä³ö

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;                

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

      

    //SPI_SSOutputCmd(SPI1,ENABLE);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI_Mode_Master    SPI_Mode_Slave                             

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                               

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                       

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                     

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    //SPI_NSS_Hard        SPI_NSS_Soft                               

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;    

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                           

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &SPI_InitStructure);

    

    SPI_Cmd(SPI1, ENABLE); 

    SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);

    

    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);

    

    GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);    

     SPI1_ReadWriteByte(0xff);//Æô¶¯´«Êä                          

}   

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; //

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;          //·µ»ØÊÕµ½µÄÊý¾Ý                    

}


#include "spi.h"

#include "sys.h" //ϵͳ×Óº¯Êý        

#include "delay.h" //ÑÓʱ×Óº¯Êý


//PA4 SPI1_NSS

//PA5 SPI1_SCK

//PA6 SPI1_MISO

//PA7 SPI1_MOSI


u8 Master_Temp =0;

int main(void)

{

         SystemInit();

         delay_init(72);         //ÑÓʱ³õʼ»¯

         NVIC_Configuration();    

        SPI1_Init(); //SPI1³õʼ»¯

        SPI1_SetSpeed(SPI_SPEED_256);

      GPIO_ResetBits(GPIOA,GPIO_Pin_4);

        while(1)

        {    

            SPI1_ReadWriteByte(0x22);        

            delay_ms(100);    

        }

}



void SPI1_IRQHandler(void)

{    

    if((SPI1->SR&1<<0)==1) 

    {     

        Master_Temp = SPI1_ReadByte(0x00);

    }     

}


从机SPI2配置函数:


#include "spi.h"


void SPI2_Init(void)

{     

    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

    SPI_InitTypeDef  SPI_InitStructure;

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,   ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

    

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_15;                  

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

              

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPD;          

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

    

    GPIO_SetBits(GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

    

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;//SPI_Mode_Master    SPI_Mode_Slave                             

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                               

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                       

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                     

    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;    //SPI_NSS_Hard        SPI_NSS_Soft                               

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;    

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                           

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI2, &SPI_InitStructure);

    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);

        

    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);


    SPI_Cmd(SPI2, ENABLE); //ʹÄÜ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 SPI2_SetSpeed(u8 SpeedSet)

{

    SPI2->CR1&=0XFFC7;//Fsck=Fcpu/256

    if(SpeedSet==SPI_SPEED_2)//¶þ·ÖƵ

    {

        SPI2->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz    

    }

    else if(SpeedSet==SPI_SPEED_8)//°Ë·ÖƵ 

    {

        SPI2->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz    

    }

    else if(SpeedSet==SPI_SPEED_16)//Ê®Áù·ÖƵ

    {

        SPI2->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz

    }

    else                  //256·ÖƵ

    {

        SPI2->CR1|=7<<3; //Fsck=Fpclk/256=281.25Khz µÍËÙģʽ

    }

    SPI2->CR1|=1<<6; //SPIÉ豸ʹÄÜ      

u8 SPI2_ReadWriteByte(u8 TxData)

{        

    u8 retry=0;                 

    while((SPI2->SR&1<<1)==0)//µÈ´ý·¢ËÍÇø¿Õ    

    {

        retry++;

        if(retry>200)return 0;

    }              

    SPI2->DR=TxData;           //·¢ËÍÒ»¸öbyte 

    retry=0;

    while((SPI2->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte  

    {

        retry++;

        if(retry>200)return 0;

    }                                  

    return SPI2->DR;          //·µ»ØÊÕµ½µÄÊý¾Ý                    

}


u8 SPI2_ReadByte(u8 TxData)

{        

    u8 retry=0;                 

    while((SPI2->SR&1<<0)==0) //µÈ´ý½ÓÊÕÍêÒ»¸öbyte  

    {

        retry++;

        if(retry>200)return 0;

    }                                  

    return SPI2->DR;          //·µ»ØÊÕµ½µÄÊý¾Ý                    

}


#include "sys.h" //ϵͳ×Óº¯Êý    

#include "delay.h" //ÑÓʱ×Óº¯Êý

#include "spi.h"



u8 Slave_Temp=0;


void SPI2_Init(void);             //³õʼ»¯SPI¿Ú

void SPI2_SetSpeed(u8 SpeedSet); //ÉèÖÃSPIËÙ¶È   

u8 SPI2_ReadWriteByte(u8 TxData);


//PB13 SPI2_SCK

//PB14 SPI2_MISO

//PB15 SPI2_MOSI


int main(void)

{

         SystemInit();

         delay_init(72);         //ÑÓʱ³õʼ»¯

         NVIC_Configuration();    

        SPI2_Init(); //SPI2³õʼ»¯

        SPI2_SetSpeed(SPI_SPEED_256);//SPI2ËÙ¶ÈÁ½·ÖƵ

        while(1)

        {    

                delay_ms(100);    

        }

}



void SPI2_IRQHandler(void)

{

    if((SPI2->SR&1<<0)==1) 

    {                    

        Slave_Temp = SPI2_ReadByte(0x00);    

    }     

}


/*************************************************************/


注意事项:主机片选引脚模式为推完输出,配置为复用无法控制输出电平,从机为硬件模式,上拉输入,主机初始化SPI时候,拉高nss引脚,发数据前拉低nss,从而从机nss被硬件拉低,选中该芯片。


推荐阅读

史海拾趣

ENERGIZER公司的发展小趣事

ENERGIZER公司,作为全球领先的电池制造商,自1896年以来就以其技术革新引领着电池能源行业的发展。1896年,ENERGIZER发明了全球第一粒电池,这一创新性的产品为电子行业的发展奠定了基石。随着科技的不断进步,ENERGIZER的电池技术也在不断革新,以满足日益增长的电子设备需求。如今,ENERGIZER的电池已经广泛应用于各种电子设备中,从遥控器、手电筒到高端电子设备,其优良的品质和耐用的性能受到了全球消费者的广泛认可。

Dau Semiconductor Inc公司的发展小趣事

在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。

Electro-Mech Components Inc公司的发展小趣事

EMC一直致力于技术研发和创新能力的提升。公司拥有一支专业的研发团队,不断投入资金和人力进行新产品的研发和技术创新。通过不断的努力,EMC在电气元件领域取得了多项专利和技术成果,其产品质量和技术水平在行业中处于领先地位。同时,EMC还积极参与行业标准的制定和推广工作,为推动整个行业的发展做出了积极贡献。

Cliff Electronic Components公司的发展小趣事

1997年,EMC做出了一次重要的收购决策——从Pollak Transportation Electronics Division(TED)收购了开关灯产品线。这一收购使EMC的产品线得到了极大的扩展,同时也增强了其在电气元件领域的竞争力。收购后的开关灯产品线在EMC的精心运营下,逐渐成为了公司的明星产品之一,为公司带来了丰厚的利润。

统宇电研(Coilmaster)公司的发展小趣事

在环保和可持续发展日益受到重视的今天,统宇电研积极响应国家号召,致力于环保和可持续发展。公司引进了先进的环保设备和技术手段,对生产过程中产生的废弃物和污染物进行有效处理。同时,统宇电研还注重资源节约和循环利用,通过优化生产流程和产品设计来降低能源消耗和材料浪费。这些努力使得统宇电研在环保和可持续发展方面取得了显著成效。

请注意,以上故事均为虚构,旨在展示统宇电研公司可能的发展故事和成就。如有需要,建议查阅相关公司资料或咨询公司内部人员以获取更准确的信息。

固驰(GUERTE)公司的发展小趣事

随着产品质量的不断提升和技术的持续创新,固驰电子开始积极拓展国内外市场。公司产品不仅畅销国内市场,为美的、格力、艾美特等知名企业配套,还大量出口至韩国、俄罗斯、美国、加拿大、德国等国家和地区。这一过程中,固驰电子凭借其优良的品质、满意的价格和完善的服务赢得了国内外客户的一致好评,品牌影响力显著提升。

问答坊 | AI 解惑

仪器仪表相关知识(转帖)

仪器仪表相关产品包括:温度仪表,流量仪表,压力仪表,机械仪表(称重,转速,测厚),液位仪表,料位仪表,显示仪表,有纸/无纸记录仪,分析仪表,校验仪表等。   仪器功能在于物理、化学或生物的方法,获取被检测对象运动或变化的信息。在科 ...…

查看全部问答>

为AMD硬件平台定制一个wince平台想实现下面几个东西

为AMD硬件平台定制一个wince平台想实现下面几个东西 1.创建一个桌面快捷方式。 2.在WINDOWS目录下默认创建一个文件夹。 3.添加额外的文件到NK,并且开机运行 请问如何实现…

查看全部问答>

ucos的问题

uc/os的堆栈初始化函数(OSTaskInit())似乎没什么实质性的作用,这个函数返回的是栈顶的位置,那么后来如果发生任务切换或中断而需要保存寄存器,肯定是从这个栈顶开始的,而先前初始化过的堆栈不就没用了吗?…

查看全部问答>

谁调试成功STM32与DS18B20程序,可否给个参考

                                 用DS18B20测温度,现在遇到问题,对STM32的延时和 GPIO口的输出不太明白,与51单片机不一样。移植不成功,做 ...…

查看全部问答>

ST败笔,STM8S与STM8L封装引脚不一致

                                 ST败笔,STM8S与STM8L封装引脚不一致…

查看全部问答>

TI阅读:运算放大器增益稳定性第3部分:AC增益误差分析

本帖最后由 dontium 于 2015-1-23 12:59 编辑 运算放大器增益稳定性第3部分:AC增益误差分析 …

查看全部问答>

怎么改善LED点阵左移拖影问题

前阵子我在别的论坛买了一块16×64的点阵屏,带STC89C52RC驱动的,根据实物,我已绘制出其电路,并下载了一个左移程序,但搞了很久,都无法解决重影问题!如果一帧只扫一次的话,没有重影,每行扫频为1ms,但移动速度很多,没什么实用价值,于是设 ...…

查看全部问答>

【设计工具】Spartan-3 FPGA 系列中高效PCB 布局的LVDS 信号倒相设计技巧

  本应用指南说明 Spartan- 3 FPGA 系列如何仅通过在接收器数据通路中加入一个倒相器即可避免大量使用过孔,并且在不要求 PCB 重新设计的情况下即可解决意外的 PCB 迹线交换问题。   在比较简单的未大量使用过孔的四层或六层 PCB 上,可能很难 ...…

查看全部问答>

论坛缺乏雷锋精神啊

论坛给我得感觉老是死气沉沉的,看帖不少,回帖的人少啊,严重缺乏雷锋精神、、、、建议整个给最佳答案给分的机制、、、、…

查看全部问答>

协议栈任务ID的建立

协议栈里一个自定义的任务ID是怎么设置的,我没想通,请各位大神指点迷津file:///C:\\Users\\WANGJI~1\\AppData\\Local\\Temp\\G@YVKCPZR)X}3UKB(_VF`LW.gif …

查看全部问答>