打印
[DemoCode下载]

基于M0516的TM1812的SPI驱动代码

[复制链接]
4403|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
缥缈九哥|  楼主 | 2015-7-9 15:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//SPI的时钟定为2.5MHZ,也就是400NS,一个数据位用3位SPI波形来表示;
//那么就把一个数据字节扩展成了24位的SPI波形字长;
//把逻辑0转化成二进制100就是0x04,就是高400nS,低800nS;
//把逻辑1转化成二进制110就是0x06,就是高800nS,低400nS;
//这样就能用SPI的MOSI发数据来驱动TM1812的DIN。

源码:
/*---------------------------------------------------------------------------------------------------------*/
/* @file     tm1812.c                                                                                                                                                                           */
/* @version  V1.00                                                                                                                                                                                   */
/* $Date:          15/07/01 11:44a $                                                                                                                                                           */
/* @brief    M051 Series UART for M35 GPRS Sample Code                                                                                                      */
/* Copyright(c) PM9GZY Technology Corp. yuanxihua@21cn.com. All rights reserved.                                     */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "main.h"

/*   M0516LBN MOSI -->  TM1812  DIN   */
/*
逻辑0        高电平时间        350-450ns        低电平时间        800-900ns
逻辑1        高电平时间        700-999ns        低电平时间        250-550ns
位逻辑  低电平时间        8-24us
逻辑0        高400NS        低800NS
逻辑1        高800NS 低400NS
复位        低2000NS
*/

/* Function prototype declaration */
void SPI0_Init(void);

void spi0_write(uint32_t word)
{
//        while(SPI_GET_TX_FIFO_FULL_FLAG(SPI0));
        /* Write to TX register */
        SPI_WRITE_TX0(SPI0, word);
        /* Trigger SPI data transfer */
        SPI_TRIGGER(SPI0);
        /* Check SPI0 busy status */
        while(SPI_IS_BUSY(SPI0));
        /* Read received data */
//        tmp = SPI_READ_RX0(SPI0);tmp=tmp;
}

//SPI的时钟定为2.5MHZ,也就是400NS,一个数据位用3位SPI波形来表示;
//那么就把一个数据字节扩展成了24位的SPI波形字长;
//把逻辑0转化成二进制100就是0x04,就是高400nS,低800nS;
//把逻辑1转化成二进制110就是0x06,就是高800nS,低400nS;
//这样就能用SPI的MOSI发数据来驱动TM1812的DIN。
void tm1812_write_byte(uint8_t byte)
{
        uint32_t tmp,data=0;
        for(uint8_t i=0;i<8;i++){tmp=(byte&1)?0x06:0x04;data|=tmp<<(i*3);byte>>=1;}
        spi0_write(data);
}
void tm1812_display_lamp(color_t *led)
{
        for(uint8_t i=0;i<24;i++)
        {
                tm1812_write_byte(led.red);
                tm1812_write_byte(led.green);
                tm1812_write_byte(led.blue);
        }
        CLK_SysTickDelay(24); //更新显示,复位时间24uS
}
void tm1812_display_all(color_t *color)
{
        color_t led[24];for(uint8_t i=0;i<24;i++){led=*color;}
        tm1812_display_lamp((color_t*)led);
}
void tm1812_display_off(void){uint32_t color =0;tm1812_display_all((color_t *)&color);}

void tm1812_display_key(uint8_t key_value,color_t *color)
{
        color_t led[24];memset((void *)&led[0],0,sizeof(led));
        led[0]=*color;for(uint8_t i=0;i<key_value;i++){led[8+i]=*color;}
        tm1812_display_lamp((color_t*)led);
}

void spi0_test(void)
{
        uint32_t i;
        for(i=0;i<254;i++){uint32_t color=i<<16;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        while(i--)        {uint32_t color=i<<16;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        for(i=0;i<254;i++){uint32_t color=i<< 8;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        while(i--)        {uint32_t color=i<< 8;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        for(i=0;i<254;i++){uint32_t color=i<< 0;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        while(i--)        {uint32_t color=i<< 0;tm1812_display_all((color_t *)&color);CLK_SysTickDelayMs(4);}
        tm1812_display_off();CLK_SysTickDelayMs(200);
}

void SPI0_Init(void)
{
        /* Select HCLK as the clock source of SPI0 */
    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);

    /* Enable SPI0 peripheral clock */
    CLK_EnableModuleClock(SPI0_MODULE);
       
        /* Setup SPI0 multi-function pins */
       
        /* Set P1 multi-function pins for SPI0  */
        SYS->P1_MFP = (SYS->P1_MFP & (~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk)))
        | (/*SYS_MFP_P14_SPISS0 |*/ SYS_MFP_P15_MOSI_0 /*| SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0*/);
       
        /* Set P1。3 pins for GPIO */
        SYS->P1_MFP = (SYS->P1_MFP & (~(SYS_MFP_P13_Msk))) | (SYS_MFP_P13_TXD1);
        /* Configure P1.3 as Input mode */
    GPIO_SetMode(P1, BIT3, GPIO_PMD_INPUT);

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init SPI                                                                                                */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Configure as a master, clock idle low, 24-bit transaction, drive output on falling clock edge and latch input on rising edge. */
    /* Set IP clock divider. SPI clock rate = 2.5MHz */
    SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 24, 2500000);

    /* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
    SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);
}

//完毕

沙发
缥缈九哥|  楼主 | 2015-7-9 15:58 | 只看该作者
基于3.02的最新BSP包的。

使用特权

评论回复
板凳
jalonfungar| | 2015-7-9 16:06 | 只看该作者
好东西!谢谢九哥分享。

使用特权

评论回复
地板
hkxiaoma| | 2015-7-9 16:09 | 只看该作者
九哥今天没白忙活啊

使用特权

评论回复
5
缥缈九哥|  楼主 | 2015-7-12 08:01 | 只看该作者
没有人喜欢呀。哈哈。

使用特权

评论回复
6
天灵灵地灵灵| | 2015-7-12 19:59 | 只看该作者
膜拜大神,刚开始看差了,以为是18B20呢。

使用特权

评论回复
7
奥德赛| | 2015-7-13 09:48 | 只看该作者
非常棒的东西啊,谢谢楼主的分享

使用特权

评论回复
8
wright0418| | 2015-7-13 10:52 | 只看该作者
九哥  太強了 ...

使用特权

评论回复
9
仙女山| | 2015-7-16 15:49 | 只看该作者
看一下,太好了,关注中

使用特权

评论回复
10
734774645| | 2015-7-16 20:21 | 只看该作者
好久不见大神更新了,学习大神的研究成果。

使用特权

评论回复
11
lwy8128| | 2016-1-14 12:11 | 只看该作者
好方法,

使用特权

评论回复
12
E-Kaia| | 2016-1-14 21:44 | 只看该作者
那这个SPI设置的采样率最高能达到多少呢

使用特权

评论回复
13
奥德赛| | 2016-1-15 21:22 | 只看该作者
SPI确实是一个非常方便的串口程序,不知道速度能达到多少

使用特权

评论回复
14
捉虫天师| | 2016-2-11 19:29 | 只看该作者
//SPI的时钟定为2.5MHZ,也就是400NS,一个数据位用3位SPI波形来表示;
//那么就把一个数据字节扩展成了24位的SPI波形字长;
//把逻辑0转化成二进制100就是0x04,就是高400nS,低800nS;
//把逻辑1转化成二进制110就是0x06,就是高800nS,低400nS;
//这样就能用SPI的MOSI发数据来驱动TM1812的DIN。

使用特权

评论回复
15
mintspring| | 2016-2-11 20:16 | 只看该作者
void tm1812_display_all(color_t *color)
{
        color_t led[24];for(uint8_t i=0;i<24;i++){led=*color;}
        tm1812_display_lamp((color_t*)led);
}

使用特权

评论回复
16
天灵灵地灵灵| | 2016-2-11 20:20 | 只看该作者
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 24, 2500000);
我喜欢这种风格,好用的很

使用特权

评论回复
17
734774645| | 2016-2-12 17:31 | 只看该作者
今天用到这个外设了,搜索进来看看怎么做

使用特权

评论回复
18
598330983| | 2016-2-13 10:44 | 只看该作者
看起来好乱,用插入代码的功能就好了,看起来结构还好

使用特权

评论回复
19
598330983| | 2016-2-13 11:08 | 只看该作者
M051_Series_BSP_CMSIS_Rev3.00.002
自从2014年就没再更新了,看来不会出新版了。

使用特权

评论回复
20
wangjiahao88| | 2016-2-20 13:54 | 只看该作者
9哥威武!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

1868

帖子

271

粉丝