OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6694|回复: 18

想用STM32 SPI1 通信 TM1642(一款国产 天微芯片 LED数码管驱动芯片)驱动数码管显示数字

[复制链接]

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-6-3 08:17:39 | 显示全部楼层 |阅读模式
5金钱
******贴上程序的。目前我想用它显示任意一个数,三位数码管******

*********程序分为 main.c spi.c spi.h tm1642.c tm1642.h和一些库文件*********、
main.c

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "tm1642.h"
#include "spi.h"
int main()
{
#ifdef DEBUG
debug();
#endif
SPI1_Init();
while(1)
{
segBufCha (888);
displayLED();

}



最佳答案

查看完整内容[请看2#楼]

恭喜恭喜,我的SPI通信也成功看到波形了!!下一步是驱动vs1003.
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2014-5-28
在线时间
0 小时
发表于 2014-6-3 08:17:40 | 显示全部楼层
恭喜恭喜,我的SPI通信也成功看到波形了!!下一步是驱动vs1003.
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:18:23 | 显示全部楼层
*********spi.h *********

#ifndef __SPI_H
#define __SPI_H

#include "sys.h"
#include "stm32f10x_spi.h" 

void SPI1_Init(void);

u8 SPI1_ReadWriteByte(u8 TxData);

#endif
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:18:59 | 显示全部楼层
*********spi.c ********* 


#include "spi.h"
#include "stm32f10x_spi.h"   

void SPI1_Init(void)
{

  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);
  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_ResetBits(GPIOA, GPIO_Pin_8);//PA8;

  SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  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_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_Init(SPI1, &SPI_InitStructure); 
  SPI_Cmd(SPI1, ENABLE);
}



//SPIx ????????×???
//TxData:????????×???
//·?????:????????×???
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:·?????????±ê????
{
retry++;
if(retry>200)return 0;
}   
SPI_I2S_SendData(SPI1, TxData); //?¨?????èSPIx·???????????
retry=0;

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:????????·???±ê????
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI1); //·????¨??SPIx×??ü??????????     
}
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:20:02 | 显示全部楼层
*****TM1642.C****
#define __TM1642_H__

#include "stm32f10x_gpio.h" 
#include "sys.h"
#include "stdbool.h"

#define SPI_CS_SET     GPIO_SetBits(GPIOA, GPIO_Pin_8)
#define SPI_CS_RESET   GPIO_ResetBits(GPIOA, GPIO_Pin_8)

//#define SPIIN   Aout(7) 

//#define COM_MASK 0xc0

#define DIS_CMD ((0x00) << 6)
#define WRT_CMD ((0x01) << 6)
#define DIS_CTRL ((0x02) << 6)
#define  ADD_SET ((0x03) << 6)  
//#define  DIS_MODE 0x03
//?????????è???ü??
#define  BIT4_SEG14 0x00 
#define  BIT5_SEG13 0x01 
#define BIT6_SEG12 0x02  
#define BIT7_SEG10 0x03  


#define DAT_WR 0x40
#define KEY_RD 0x42
#define ADD_INC 0x40  
#define ADD_ABS 0x44  
#define  NORMAL 0x40
#define TEST   0x48

#define DIS_ADDR 0xC0

#define  CUR_1_16   0x80
#define  CUR_2_16   0x81
#define CUR_4_16   0x82
#define CUR_10_16   0x83
#define CUR_11_16   0x84
#define CUR_12_16   0x85
#define CUR_13_16   0x86
#define CUR_14_16   0x87

#define DIS_OFF   0x80
#define DIS_ON   0x88

#define  KS7 0x01
#define KS8     0x08
#define   SW1 KS10
#define  SW2 KS9

extern int8_t wrBuffer[8]; 
extern int8_t rdBuffer[5];
extern void SPI_writedata ( int8_t *dat,int8_t len );
//extern void SPI_writebyte ( int8_t byte);
extern void tm1642_Init ( void );



/*
#define HIGH 1
#define LOW 0
#define NULL ((void*)0)
#define EOF -1
#define NONE -1
#define EOS '\0'12 
#define OK 0
#define ERROR -1*/




#ifndef __INC_DISPLAY_H__
#define __INC_DISPLAY_H__

#include "tm1642.h"
#include "stdint.h"

#define LED_ON 1
#define LED_OFF 0

#define LED_MASK 0xfc00
#define SEG_MASK 0x3ff
extern void displayLED(void);
extern void ledCtrl (int8_t ledValue,bool OnOff);
extern void segBufCha (int16_t dat);
extern void segBufErr (void);
extern void segBufon (void);
extern void segBufoff (void);
extern void segBufnull (void);
#endif




//extern void bufChange ( int8_t glitter, int16_t dat, ledChannel ch, BOOL sw );

/*
typedef enum
{
LED_OT     = ( int8_t )0x00,
LED_HOT_START  = ( int8_t )0x01,
LED_ARC_FORCE  = ( int8_t )0x02,
LED_VRD_STATUS  = ( int8_t )0x03,
LED_VRD      = ( int8_t )0x04,
LED_ALL       = ( int8_t )0xff
}ledChannel;
*/
//#define OT 0x01
//#define HOT  0x02
//#define ARC  0x04
//#define VRD_S 0x08
//#define VRD 0x10
//#define ALL 0x1f
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:20:47 | 显示全部楼层
*****TM1642.C**** 

#include "tm1642.h"
#include <math.h>
#include "stdint.h"
#include "spi.h"
#include "delay.h"
#include "stm32f10x_spi.h" 
int8_t rdBuffer[5] = {0};
int8_t wrBuffer[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
int8_t command[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
int8_t __I seg_code_cc[] =
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,//0x3f,0x79,0x71,0x37,0x50,0x00,
};//0   1    2    3    4     5    6   7     8    9       O    E    F    n    r  

void segBufCha (int16_t dat)
{
int8_t i,j;
int16_t temp = dat;
  j = 1 + (int)log10(dat);

for ( i = 0; i < 8; i++ )
    { 
wrBuffer = 0;
}     
for ( i = 0; i < j; i++ )
{
if (seg_code_cc[ temp % 10 ]<0x40)
  wrBuffer [ i * 2 ] = seg_code_cc[ temp % 10 ]; 
else
    wrBuffer [ i * 2 ] = seg_code_cc[ temp % 10 ]-0x40; 
      wrBuffer [ i * 2 + 1 ] = 0x01;
      temp = temp / 10;
}
}

void displayLED (void)

int8_t i,k;
      wrBuffer[0] = BIT7_SEG10;//????????????
    SPI_CS_RESET;
                 for ( k = 0; k < 10; k++ );
      SPI1_ReadWriteByte(wrBuffer[0]);
    SPI_CS_SET;
       
 
      wrBuffer[0] = DAT_WR | ADD_INC;//?????????????????÷?????·×???????1
    SPI_CS_RESET;
              for ( k = 0; k < 10; k++ ); 
      SPI1_ReadWriteByte(wrBuffer[0]);
    SPI_CS_SET;
        
    //delay_ms(500);

      wrBuffer[0] = 0xC0;//???????·00H????
    SPI_CS_RESET;
                for ( k = 0; k < 10; k++ ); 
    SPI1_ReadWriteByte(wrBuffer[0]);
        SPI_CS_SET;
                
   // delay_ms(500);
        SPI_CS_RESET;
         for ( k = 0; k < 10; k++ ); 
      for ( i = 0; i < 8; i++ )
         {
            SPI1_ReadWriteByte(wrBuffer);   //????????   
         }
SPI_CS_SET;
      wrBuffer[0] = CUR_14_16|DIS_ON;//?è?????÷±?14/16,??????
 SPI1_ReadWriteByte(wrBuffer[0]);   
}




/* void segBufErr (void)
{
   wrBuffer[1] = 0x50;
  wrBuffer[3] = 0x50;
  wrBuffer[5] = 0x79;
}

void segBufOn (void)
{
    wrBuffer[1] = 0x37;
  wrBuffer[3] = 0x3f;
  wrBuffer[5] = 0x00;
}

void segBufOff (void)
{
    wrBuffer[1] = 0x71;
  wrBuffer[3] = 0x71;
  wrBuffer[5] = 0x3f;
}

void segBufNull (void)
{
    wrBuffer[1] = 0x00;
  wrBuffer[3] = 0x00;
  wrBuffer[5] = 0x00;
}*/

/*void ledCtrl (int8_t ledValue,_Bool OnOff)
{
if ( OnOff == 1 )
{
   wrBuffer[7] |= ledValue;
}
else if ( OnOff == 0 )
{  
   wrBuffer[7] &= ~ledValue;
}
}
*/
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:21:07 | 显示全部楼层
TM1642.C是程序的主要部分
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:25:54 | 显示全部楼层
SPI信号出来了,PA5 时钟信号和PA7数据发出信号和PA8片选信号在示波器上看都正常,我贴图就是显示不出来。。。
wifi0s0-648429439IMG_20140530_095951.jpg
wifi0s0-9984845021401416408476.jpg
wifi0s0-18309822711401416808518.jpg
wifi0s0-1015947789IMG_20140530_101528.jpg
wifi0s020142728711401417186008.jpg
wifi0s0-2118457217IMG_20140531_165941.jpg
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2014-6-3 08:28:16 | 显示全部楼层

TM1642_V1.1.pdf

571.97 KB, 下载次数: 855

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-3 08:51:15 | 显示全部楼层
工程文件源码。。。MDK V5 编写。

ALIENTEK MINISTM32 驱动TM1642模块.rar

338.9 KB, 下载次数: 812

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-17
在线时间
10 小时
发表于 2016-3-17 16:54:23 | 显示全部楼层
void segBufCha (int16_t dat)
{
                int8_t i,j;
                int16_t temp = dat;
                j = 1 + (int)log10(dat);

                for ( i = 0; i < 8; i++ )          //初始化
                {  
                   wrBuffer[i] = 0;
                }
               
                for ( i = 0; i < j; i++ )
                {
                   if (seg_code_cc[ temp % 10 ]<0x40)
                             wrBuffer [ i * 2 ] = seg_code_cc[ temp % 10 ];  
                   else
                                   wrBuffer [ i * 2 ] = seg_code_cc[ temp % 10 ]-0x40;
                         
                                         wrBuffer [ i * 2 + 1 ] = 0x01;
                                         temp = temp / 10;
                }
}

这段代码不是很懂,什么意思??
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-21 07:49:36 | 显示全部楼层
code609 发表于 2016-3-17 16:54
void segBufCha (int16_t dat)
{
                int8_t i,j;

j = 1 + (int)log10(dat); 得到这个数是几位数。  下面就是数组里面显示的数码管123.。。。转化成要写入的数
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-17
在线时间
10 小时
发表于 2016-3-22 18:41:10 | 显示全部楼层
void TM1642_WriteByte(u8 *D,u8 len)
{
        u8 i,j,temp;
        TM1642_CS()=0;
        delay_us(2);
        for(i=0;i<len;i++){
                temp=*(D+i);
                for(j=0;j<8;j++){
                        TM1642_CLK()=0;
                        TM1642_DIN()=temp&1;
                        temp>>=1;
                        TM1642_CLK()=1;
                        delay_us(1);
                }
        }
  TM1642_CS()=1;
}
是什么意思,看的不是很懂,为什么是8,而且temp=*(D+i);
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-23 08:20:23 | 显示全部楼层
code609 发表于 2016-3-22 18:41
void TM1642_WriteByte(u8 *D,u8 len)
{
        u8 i,j,temp;

unsigned char 类型 八位
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-3-23 08:21:03 | 显示全部楼层
code609 发表于 2016-3-22 18:41
void TM1642_WriteByte(u8 *D,u8 len)
{
        u8 i,j,temp;

temp=*(D+i);是取地址上面的数
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2024-5-26
在线时间
4 小时
发表于 2016-9-26 20:49:42 | 显示全部楼层
void TM1642_WriteByte(u8 *D,u8 len)//DATA   len&pound;&raquo;length  of data
{
        u8 i,j,temp;
//         TM1642_CS()=0;
        delay_us(2);
        for(i=0;i<len;i++)
        {
                temp=*(D+i);  //&Ouml;&cedil;&Otilde;&euml;&pound;&not;D+i&Ouml;&cedil;&Iuml;ò&Auml;&Uacute;&acute;&aelig;&micro;&Oslash;&Ouml;·&Ouml;&ETH;&acute;&aelig;&acute;&cent;&micro;&Auml;&Ouml;&micro;&cedil;&sup3;&cedil;&oslash;temp
                for(j=0;j<8;j++)
                {
                        TM1642_CLK()=0;
                        TM1642_DIN()=temp&1;
                        temp>>=1;
                        TM1642_CLK()=1;
                        delay_us(1);
                }
        }
//   TM1642_CS()=1;
}

中TM1642_DIN()=temp&1;
                        temp>>=1;是什么意思?
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
 楼主| 发表于 2016-9-28 08:50:29 | 显示全部楼层
88小田田 发表于 2016-9-26 20:49
void TM1642_WriteByte(u8 *D,u8 len)//DATA   len&pound;&raquo;length  of data
{
        u8 i,j,temp;

不断的取最低位
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2017-5-21
在线时间
18 小时
发表于 2017-7-4 18:42:23 | 显示全部楼层
一头雾水,我现在也困在这地方
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-4-22
在线时间
3 小时
发表于 2018-5-25 15:56:19 | 显示全部楼层
5V工作的TM1638/1641的端口输入高电平要求至少3.5V,3.3V工作的STM32的端口输出高电平时电压至少为2.0-2.2V左右,怎么解决兼容性?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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