关于STM32 SPI外设太鸡肋,I读TM1628 时查询发送方式好折磨

2019-07-19来源: eefocus关键字:STM32  SPI外设  TM1628  查询发送方式

本人使用STM32F334读写TM1628,也参考了网上一大堆的例子,查询发送数据到TM1628,发现大部分网上的例子都是用的是TXE 标志位  SPI_I2S_FLAG_TXE,要注意此标志位在手册上图片显示的是只要FIFO的数据移动到发发送缓冲器里面之后就会置位所以TXE的置位并不代表所有传输完成只代表可以接着发送数据,而是等到BSY置位后才表明发送结束,对于判断发送单个字节则需要结合BSY来判断,对于多个字节则是要结合TXE和BSY一起来使用是最好的。对于中断发送的话本人暂时还是没有好的方法毕竟BSY不能产生中断。总之感觉太不顺手

波形分析

 

波形分析2

附上个人demo


uint8_t TM1628_WritePro(void)

{

  if(0==TM1628_State)return 0;

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0x00);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);          

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI1->DR = 0x44; 

  SPI_SendData8(SPI1,0x44);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0xC0);

  SPI_SendData8(SPI1,TM1628_DATA[0]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);         

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0xC2);

  SPI_SendData8(SPI1,TM1628_DATA[1]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0xC4);

  DelayXu(20);

  SPI_SendData8(SPI1,TM1628_DATA[2]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0xC6);

  SPI_SendData8(SPI1,TM1628_DATA[3]);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB;

  DelayXu(50);

  ClrSTB;

  SPI_SendData8(SPI1,0x89);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);              

  SetSTB; 

  TM1628_State = 0 ;

  return 0;

}


关键字:STM32  SPI外设  TM1628  查询发送方式 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468585.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:不同stm32f103芯片内部外设资源
下一篇:STM32CubeMX图形化配置软件使用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32流水灯(基于库函数)
,GPIO_Pin_5);/ /PE.5 输出高}该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PB5和 PE5 为推挽输出。 这里需要注意的是: 在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设, 在固件库中对挂载在 APB2 总线上的外设时钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。LED.h程序代码书写#ifndef __LED_H#define __LED_H#include "sys.h"//LED 端口定义#define LED0 PBout
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
STM32流水灯的几种实现方法
#include “stm32f10x.h”void RCC_Configuration(void);//2void GPIO_Configuration(void);//GPIOvoid Delay(u32 count){u32 i=0;for(;i<count;i++);}int main(void){ RCC_Configuration();//3LED_Init();while(1){GPIO_SetBits(GPIOA,GPIO_Pin_0);//第一灯亮Delay(800000); //延时GPIO_ResetBits(GPIOA,GPIO_Pin_0); //第一灯灭Delay(800000); //延时
发表于 2019-10-21
STM32学习探究:流水灯的实现
流水灯的实现这里我们使用 stm32mini 开发板实现外接流水灯,这里我采用了三个灯(说明问题就可以了)。外接的引脚分别为PA2,PB8,PC13三个引脚,在连接的时候,采用灯的正极接GPIO引脚,负极接GND(这是一种合理的方式)。注意:虽然接VCC也可以发光,但是这样不是合理的连接方式,而且,发光的情况刚好与接GND的情况相反。参考的相关资料如下:时钟使能:端口配置:端口输出:具体实现的代码如下://led.h文件#ifndef __LED_H#define __LED_H  #include "sys.h"//LED端口定义#define LED0 PAout(2)#define LED1
发表于 2019-10-21
STM32学习探究:流水灯的实现
STM32学习探究:流水灯的实现
流水灯的实现这里我们使用 stm32mini 开发板实现外接流水灯,这里我采用了三个灯(说明问题就可以了)。外接的引脚分别为PA2,PB8,PC13三个引脚,在连接的时候,采用灯的正极接GPIO引脚,负极接GND(这是一种合理的方式)。注意:虽然接VCC也可以发光,但是这样不是合理的连接方式,而且,发光的情况刚好与接GND的情况相反。参考的相关资料如下:时钟使能:端口配置:端口输出:具体实现的代码如下://led.h文件#ifndef __LED_H#define __LED_H  #include "sys.h"//LED端口定义#define LED0 PAout(2) #define LED1
发表于 2019-10-21
STM32学习探究:流水灯的实现
STM32流水灯的几种实现方法
#include “stm32f10x.h”void RCC_Configuration(void);//2void GPIO_Configuration(void);//GPIOvoid Delay(u32 count){u32 i=0;for(;i<count;i++);}int main(void){ RCC_Configuration();//3LED_Init();while(1){GPIO_SetBits(GPIOA,GPIO_Pin_0);//第一灯亮 Delay(800000); //延时 GPIO_ResetBits(GPIOA,GPIO_Pin_0); //第一灯灭 Delay(800000); //延时
发表于 2019-10-21
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved