历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2018年12月03日 | STM32F103做从机SPI通信SPI3中断异常

2018-12-03 来源:eefocus

在做AM335D板子与STM32F103使用SPI通信时,需要用到STM32的从机模式,所以特别对于ST的从机模式进行了研究,由于硬件上使用的是STM32F103的SPI3,所以过程中遇到了一点麻烦,这里记录一下过程,以备查阅:


使用SPI3通信时,从机时钟产生不了中断,经过查阅资料,是因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下两点就可以了:


1.开启GPIO时钟的同时,开启AFIO时钟,如下:


RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );    


2.关闭JTAG功能,使能SWD 如下:


GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;


其他的SPI口正常配置,因为板子重启后默认为JTAG模式,所以注意千万不要使用GPIO_Remap_SWJ_Disable ,一旦这样就不能下载程序了,要使用ST的那个工具专门烧录。


以下是具体的代码:


extern u8 SPI3_Buffer_Rx[];

extern u8 RxIdx ;

u16 net_spi_Write(void);

 

void SPI3_Slave_Init(void)

{


GPIO_InitTypeDef GPIO_InitStructure;

    //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);


RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );             

    //RCC_APB2Periph_AFIO很重要

RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3, ENABLE );


GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ; //disable掉JTAG复用,很重要

 

/* MISO设置为推挽输出 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

/* SCK和MOSI设置为下拉输入 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

SPI3_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 

SPI3_InitStructure.SPI_Mode = SPI_Mode_Slave;

SPI3_InitStructure.SPI_DataSize = SPI_DataSize_8b;


SPI3_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI3_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;


SPI3_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI3_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //

SPI3_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI3_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI3, &SPI3_InitStructure);  //


SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_RXNE, ENABLE); 

 

SPI_Cmd(SPI3, ENABLE); 


//SPI1_ReadWriteByte(0xff);  

}   

 

  

void SPI3_SetSpeed(u8 SpeedSet)

{

SPI3_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;

    SPI_Init(SPI3, &SPI3_InitStructure);

SPI_Cmd(SPI3,ENABLE);

 

 

u8 SPI3_ReadWriteByte(u8 TxData)

{

u8 retry=0;

while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //发送缓存标志位

    {

retry++;

if(retry>200)return 0;

}   

SPI_I2S_SendData(SPI3, TxData); //发送数据

retry=0;

 

while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)//接收缓存标志位

{

retry++;

if(retry>200)return 0;

}       

return SPI_I2S_ReceiveData(SPI3); //返回接收到的数据     

}

 

void SPI_net_Init(void)

{

SPI3_Slave_Init();    

 

void NVIC_config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = SPI3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

 

void SPI3_IRQHandler(void) 

{

volatile uint8_t data;

if(SPI_I2S_GetITStatus(SPI3, SPI_I2S_IT_RXNE) == SET)

while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)

{

}

SPI3_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI3);

while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)

{

}

SPI_I2S_ClearITPendingBit(SPI3, SPI_I2S_IT_RXNE);

}

 

void net_spi_read_loop(void)

{

u8 i;

while (1)

  {

     if(RxIdx>=10)

     {

        SPI_Cmd(SPI3, DISABLE);

        RxIdx=0;

printf("rcv full:\n");

        for(i=0;i<10;i++)

           printf("0x%02X ",SPI3_Buffer_Rx[i]);

printf("\r\n ");

memset(SPI3_Buffer_Rx,0,10);

    SPI_Cmd(SPI3, ENABLE);

 

     }

  }



}

 


推荐阅读

史海拾趣

CLAIREX公司的发展小趣事

为了进一步扩大市场份额,Clairex开始积极寻求与各大企业的合作。他们与多家知名航空公司、电子设备制造商等建立了长期稳定的合作关系,为其提供高质量的电子部件和解决方案。同时,Clairex还积极参加各类行业展会和交流活动,与业界同行分享经验、探讨合作。这些举措不仅提升了Clairex的品牌知名度,也为其带来了更多的商业机会。

Allianc公司的发展小趣事

Allianc公司成立于XXXX年,初创时期面临着资金短缺、市场竞争激烈等诸多挑战。公司创始人凭借对电子行业的深刻理解和敏锐的市场洞察力,带领团队开发出了一款具有创新性的电子产品,并成功获得了第一批订单。然而,随着市场的不断变化和竞争的加剧,公司必须不断创新和优化产品,才能保持竞争优势。在创始人的带领下,Allianc公司逐步稳定了市场地位,为后续发展奠定了坚实基础。

泰科天润(GPT)公司的发展小趣事

在电子行业竞争日益激烈的背景下,Allianc公司深知只有不断创新才能保持竞争力。因此,公司加大了对研发创新的投入力度,建立了完善的研发体系和激励机制。通过持续的创新和优化,公司不断推出新产品和新技术,满足了市场的不断变化和消费者的多样化需求。这些创新举措不仅提升了公司的竞争力,也为公司的长期发展注入了新的动力。

Echelon公司的发展小趣事

Echelon公司成立于上世纪80年代,最初以研发LonWorks技术为核心。LonWorks是一种网络通信协议,用于连接各种智能设备,实现设备间的通信和协作。随着技术的成熟,Echelon开始将LonWorks技术应用于能源管理领域,推出了基于LonWorks的能源管理服务方案。这一创新的服务方案使得Echelon在能源管理市场崭露头角,为公司的后续发展奠定了坚实的基础。

Chino-Excel公司的发展小趣事

面对日益严峻的环境问题,Chino-Excel公司积极倡导环保理念,将绿色生产贯穿于整个产业链。公司采用环保材料和节能技术,降低产品生产和运营过程中的能耗和排放。同时,公司还积极参与环保公益活动,推动整个行业向更加环保、可持续的方向发展。

Custom Mmic Design Services Inc公司的发展小趣事

Custom Mmic Design Services Inc(以下简称CMDS)在成立的初期,就致力于开发高性能的微波单片集成电路(MMIC)。当时,市场上对于高频、低功耗的MMIC需求日益增长,但现有产品往往难以满足特定应用的性能要求。CMDS团队通过深入研究,成功开发出了一款新型MMIC,其性能在行业内处于领先地位,迅速获得了客户的认可。这一技术突破不仅为CMDS带来了可观的订单,也使其在微波集成电路领域确立了领先地位。

问答坊 | AI 解惑

matlab信号处理详解

《Matlab信号处理详解》详细介绍Matlab在数字信号处理中的应用实例,各种数字滤波器的设计,包含源程序…

查看全部问答>

H-FLASHER查询不到Flash怎么回事啊。

我用的LPC2378,使用H-JTAG几乎都可以查询到芯片,再用H-FLASHER时大多数只能查到\"Target:ARM7TDMI-S Little-Endian\",而在\"Flash:ERROR\"。在H-FLASHER里选芯片选过LPC 2378和LPC2378_A都不好用。我的并口设置的是SPP模式。…

查看全部问答>

高性能低成本S3C2416微型ARM9嵌入式模块

◆ 全面替代S3C2440,且性价比更优 ◆ 模块背面无任何器件,方便直接贴焊或通过插针与底板相连 ◆ 商业级(0°~70°)、工业级(-40°~85°) ◆ 微尺寸(40x40x4mm)、低价格(千片价…

查看全部问答>

vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之

如题:我想在winCE里写一个FTP上传文件的程序,vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 错误        1        ...…

查看全部问答>

usb mass storage 问题

MARVELL PXA310+WM6.0(littleton的BSP)下添加usb mass storage 功能: 以便设备连接到PC上时,能使SD卡像U盘一样在“我的电脑”里呈现出一个盘符, 不通过ActiveSync而是通过usb直接访问。 现在注册表设置好了(99%没错),usbmsfn.dll也已经 ...…

查看全部问答>

pwm电路控制的直流电机

做了个PWM电路来控制直流电机,用C语言编译后,在keil中运行时有5个警告,不知错在何地方,请内行指点下,本人不胜感激!见原图: …

查看全部问答>

初学嵌入开发,请问看哪些书籍会比较合适

大家好,我是初学嵌入开发,请问看哪些书籍会比较合适。 谢谢。 …

查看全部问答>

关于assert的错误

在有些时候,建好工程后调试会出现assert的错误,这个错误不知道是怎么回事,好象跟设置和程序都没关系.请问这个错误怎么处理的…

查看全部问答>

跪求MSP430的开发实例

小弟初来乍到,是MSP430的初学者,跪求适合初学者做的案例来作参考,请各位大神多多照顾 …

查看全部问答>

最菜鸟的msp430 1602 三位数自加程序

最菜鸟的msp430 1602 三位数自加程序 刚入门的菜鸟们请借鉴!!…

查看全部问答>