采用TI MCU碰到的问题和后来的解决办法
1、所有故事均须为参与者原创;
2、文字150字以上;
3、描述清晰、具体。
一等奖1名 : 拉杆电脑包一个或9B96EVM板子一块或F28035开发板(内置XDS100仿真器)
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
既然没有人开这个头,我就来开个头吧!
我97年就开始接触TI的DSP芯片,在单位一直从事TI DSP的开发工作,从最初的 LF2407,F2812,到后来的F28335以及现在的C28346。最近用C28346在开发产品。来谈谈我对F28335和C28346的一些看法。LF2407就不用说啦,即将淘汰。F28335就是F2812 的升级换代产品,F28335的浮点处理器,HRPWM,以及AD等的性能都是大大优于F2812,并且市场上的价格也比F2812低。
所以现在就详细的说一下F28335和C28346。这两者的主要区别是:
1.F28335的最高运行速度是150M,C28346则达到300M;
2.F28335内部有FLASH和高速AD,但内部RAM较小,28346则没有内部FLASH和AD,但内部RAM很大;
3.其它方面都没有多大的差别,无外乎就是外设多与少的问题。
F28335虽然有内部FLASH,但是大家都知道FLASH的读写速度和内部的RAM是没法比的,所以经常会出现一些这样的问题:明明在RAM中调试好的程序,烧写到FLASH中运行结果缺不正确,究其原因就是FLASH的读写速度过慢造成。
C28346则不存在这个问题,在RAM中调试好的程序,BOOT后还是在RAM中运行,而且C28346的运行速度比F28335快1倍(都在内部RAM中运行,如果换成F28335在FLASH 中运行程序,就是快好几倍的问题啦),另外F28335虽然有内部AD,但是精度不够,只有12位,而我们大部分的应用这个精度是不能满足的,需要外扩AD,所以这样一来F28335上的AD就显得有些鸡肋。
相比之下C28346更适合应用在电能质量监测,机器人,工业控制等领域。
这么给力,怎么能不顶一下那,路过,就写一点吧
08年毕业,接触MSP430,从事三表行业。
第一次见msp430,头都疼,那小引脚,和蚂蚁腿差不多,怎么看怎么不习惯,可能是在学校用DIP的51习惯啦吧。
从整体上讲,MSP430最突出的贡献就是低功耗,虽然现在其他家也在推各自低功耗MCU 但是效果以及性能远不如430
再就是各种外设齐全,配套资源丰富。从1xx系列的到现在最新的6xx系列的,贯穿整个三表行业,用于电表的,有专用的42xx系列支持, 用于做水表的,有scan_if专用模块支持,用于做气表的,有内置的LCD驱动支持。还有许多超低成本的MCU如Gxx系列的以及F200X系列的,虽然芯片个头小,引脚小,但却因为其极低的功耗,16位的运算能力,广泛应用与智能家居节点处理。
在最开始是使用的汇编语言写程序,那个时候真是一个字节一个字节的数内存,自己分配内存,位位在心中。
后来改为C语言写程序,不用亲自分配内存啦,但是总感觉没有汇编写出来的程序占用的空间少,没有汇编写出来的程序效率高。
到现在,已经有3个年头多啦,一直是430的忠实支持者,而且也会一如既往的支持。
在谈点如何学430吧,我比较笨,也比较穷,学430过程中只看了User's guide和Data sheet这两样,余下的就是在TI的论坛或者利尔达的论坛再就是微控网上学习啦。
个人建议初学者最后有块小的核心板,不要用现在市面上的什么美其名曰学习板,很多IO都是定死的。拥有一块核心板,余下的外围电路可以用洞洞板自己搭。这样既学习430 有段俩自己的硬件,一举两得。
还有就是 术业有专攻,没有过不去的坎,有时候卡在那,出去休息休息,然后在做。
得,就到这吧,希望社区越办越好!
======================================
打造前沿 创造极限
======================================
接触TI的东西是在去年中吧,实验室要做一款便携式的产品,因为产品有两个硬性的指标:
首先,必须是便携式产品,所以对产品功耗要求特别苛刻,省电可以说是产品成败的关键;
其次,分析了同类电子产品只提供简单控制、简单分析的弱点,本设计立足于增强产品的分析处理能力。
基于此我们进行了很多的平台选择,最终选择了TI公司生产的OMAP3530处理器作为产品的开发芯片,主要看中了OMAP3530的低功耗和强劲的数字信号处理能力、还有就是ARM端强大的控制能力。从此踏上了OMAP3530学习的漫漫征程,面对中文资料很少等困难,一点点地读TI提供的资料(太多了,多到吓人啊!),一点点地摸索,系统移植、DVSDK移植、程序开发...这样子一路走来,只能说是艰辛并快乐着吧!
本人25至今未婚,已经谈过三个“女友”,正在交往的还有两个,我比较花心,第一个“对象”是我大学时谈的——51,第二个"对象"是来到单位时在部门经理的介绍下相识的——PIC,第三个“对象”是另一个部门经理介绍的,这个部门经理说这个对象比我以前交往的条件的好(有车有房)——STM32,于是我变与她交往了一年,至今还藕断丝连,没办法已经有孩子了(产品)。就在8月8日那天我在菜农老师的介绍下认识了她(我正在交往的女友)——NUC,现在我与她的情感已经升华,时不时去逛逛街,看看电影。后来在二姨家偶然的机会,我看到了一位美眉应招男友的帖子——免费申请LM3S811开发板,之前说了我比较好色,这等好事我哪能放过,于是乎我给那位美眉谢了封信,有可能是我的真诚打动了她,在9月18日那天我突然收到这位妹妹给我的定情信物——LM3S811开发板,这位美眉就是——TI,在这种情况下我认识了她,由于最近我与前女友的那个孩子(产品)老生病(bug),忙的是焦头烂额,没有时间与TI美眉交往,俗话说一会生二回熟,三回....,等以后有时间我回与TI美眉好好交往,促进感情的升华,争取早日有我们的宝宝!马上下班了,匆忙之中写的不好希望大家拍砖!
前几天正好焊了个9b96的板子,之前申请的几个样片,由于有一个焊坏了,JTAG调试也调不通,很可惜,于是就用锉刀把塑胶封装去掉了,下面就是高清拆解。
9B96自带以太网和mac,锉开一看里面是有一个很大的散热片,wafer是被粘在铜片上,也怪不得这个片子用以太网总是发热的厉害,也是里面散热非常均匀。
这回的9B96板子也是针对以太网芯片的发热问题在芯片的底部加了些过孔。
同时9b96这个片子里面自带Stellaris ware的库,开发起来周期可以尽可能的减小,而且内置了safertos,对开发者来说非常方便。
下面是我对芯片的一些拆解,同时也看的出,TI的芯片设计做的相当好,9b96后面几个版本各种error改的也是相当的迅速。也希望ti能推出更多更好的芯片!
开始学习DSP的时候,在串口使用时,不通过中断接收和发送信息使用了下面的例程可以实现信息的发送与接收,但是使用了中断以后,程序不执行。
Send_Flag = 0;
#if SCIA_INT
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TXAINT = &SCITXINTA_ISR;
PieVectTable.RXAINT = &SCIRXINTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
if((SciaTx_Ready() == 1) && (Send_Flag == 1))
{
SciaRegs.SCITXBUF = Sci_VarRx;
Send_Flag = 0;
i++;
if(i == j)
{
i = 0;
j = 0;
}
}
#if !SCIA_INT
if(SciaRx_Ready() == 1)
{
Sci_VarRx[j] = SciaRegs.SCIRXBUF.all;
Send_Flag = 1;
j++;
if(j == 100)
{
j = 0;
}
}
#endif
}
后来,我发现原来在添加库中,需要更改设置的函数,修改了下面的程序,结果就可以接收到了程序了:
所写的串口中断程序如下:
#include "DSP28_Device.h"
unsigned int Sci_VarRx[100];
unsigned int i,j;
unsigned int Send_Flag;
unsigned int * Led8 = (unsigned int *) 0x4100;
//#define SCIA_INT 1
interrupt void SCITXINTA_ISR1(void);
interrupt void SCIRXINTA_ISR1(void);
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitSci();
for(i = 0; i < 100; i++)
{
Sci_VarRx = 0;
}
i = 0;
j = 0;
Send_Flag = 0;
#if SCIA_INT
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TXAINT = &SCITXINTA_ISR1;
PieVectTable.RXAINT = &SCIRXINTA_ISR1;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
if(1 && (Send_Flag == 1))
{
SciaRegs.SCITXBUF = Sci_VarRx[0];
while(SciaRegs.SCICTL2.bit.TXRDY!=1);
Send_Flag = 0;
i++;
if(i == j)
{
i = 0;
j = 0;
}
}
#if !SCIA_INT
if(SciaRx_Ready() == 1)
{
Sci_VarRx[j] = SciaRegs.SCIRXBUF.all;
Send_Flag = 1;
j++;
if(j == 100)
{
j = 0;
}
}
#endif
}
}
interrupt void SCITXINTA_ISR1(void)
{
}
interrupt void SCIRXINTA_ISR1(void)
{
DINT;
PieCtrl.PIEACK.bit.ACK9=1;
Sci_VarRx[0] = SciaRegs.SCIRXBUF.all;
Send_Flag = 1;
j++;
// if(j == 100)
// {
// j = 0;
// }
*Led8=j;
SciaRegs.SCICTL1.bit.SWRESET =1;
PieCtrl.PIEIFR9.bit.INTx1=1;
EINT;
}
Lm3s811写一个定时的中断程序,这样的延时虽然很费劲,但是有助于我们对lm3s811的理解。
下面是我遇到了一些问题来和大家分享一下:
定时器一般无法进入中断:是因为我们没有修改定时器终端的地址:
DCD IntDefaultHandler ; ADC Sequence 0
DCD IntDefaultHandler ; ADC Sequence 1
DCD IntDefaultHandler ; ADC Sequence 2
DCD IntDefaultHandler ; ADC Sequence 3
DCD IntDefaultHandler ; Watchdog
DCD Timer0A_ISR ; Timer 0A就是修改的这里,将定时器的地址在这里输入就可以了
DCD IntDefaultHandler ; Timer 0B
DCD IntDefaultHandler ; Timer 1A
DCD IntDefaultHandler ; Timer 1B
DCD IntDefaultHandler ; Timer 2A
DCD IntDefaultHandler ; Timer 2B
DCD IntDefaultHandler ; Comp 0
别忘了声明 extern Timer0A_ISR
下面我们就开始配置定时器了:
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ|SYSCTL_USE_OSC|SYSCTL_SYSDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); //系统时钟设置
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); //使能定时器0外设
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器0为周期触发模式
TimerLoadSet(TIMER0_BASE, TIMER_A,6000000 ); // 设置定时器装载值:定时1秒
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 设置定时器为溢出中断
// 使能定时器0外设
IntMasterEnable(); // 处理器使能。
TimerEnable(TIMER0_BASE, TIMER_A);
这个一般不需要修改就可以了!!!!!
写一个延时程序:
void delay()
{
IntEnable(INT_TIMER0A);
while(!(TimerIntStatus(TIMER0_BASE,false)&TIMER_TIMA_TIMEOUT));
IntDisable(INT_TIMER0A);
}
这里是利用的定时器中断的标志位来实现定时的 ,这样精确了很多,不过有点费力不讨好的感觉,不过大家将就着看吧,用起来还行的!
void Timer0A_ISR (void)
{
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
}
最后来清除定时器的中断标志防止一直在执行!
哈哈 好了!写个流水灯看看吧!!!
学习LM3S811就得首先会使用编译器,我选择用的是keil uvision4 (用的习惯,IAR也不错的,不过感觉不如keil顺手)。记得得安装keil里面的arm(注册机也得注册成功)
先来建立一个工程:
选择芯片信号(在Luminary Micro下的LM3S811):
样我们就建好了一个空白的工程,至于新建文件就不用说了,大家都懂得!
我们添加如下的代码(代码是别人写的):
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
int main()
{
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ|SYSCTL_USE_OSC|SYSCTL_SYSDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIODirModeSet(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_DIR_MODE_OUT);
/
GPIOPadConfigSet(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);
while(1){
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0Xff);
SysCtlDelay(SysCtlClockGet()/6); GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0x00);
SysCtlDelay(SysCtlClockGet()/6);
}
}
点击编译:
哈哈 出现错误了!!!!!
怎么办????怎么办???
其实就是缺少库!!!!
把这个库加压到我们新建的工程里面(我把光盘也放到下面了)
现在就编译通过了
记得把晶振改成6m ,据说不改 会下载错误!!!!!!
这个时候,我们就得自己来编写程序,是不是很麻烦?????????
要是能吧以前单片机的程序移植过来就好啦(相信大家都自己攒了不少的例程了吧!!!)
现在我们开始我们的ARM之旅吧!!!!!!!!!!!!!!!!!!!!!!!!!
感觉身边使用MSP430的客户特别多,网上资料多,参考书籍也很多,便开始评价MSP430系列MCU。
看到网上开发工具很多,也有免费申请的,便申请了一套学习板。开始学习使用,下载示例代码,修改测试,享受开发的乐趣。
从硬件结构上比较,51单片机和MSP430单片机都采用冯·诺依曼结构,而PIC单片机则采用哈佛结构。这两种结构各有优点,很难说出谁好谁坏。
MSP430单片机同样也有MSPX1XX、MSPX2XX、MSPX3XX、MSPX4XX等系列,且每一系列可选型号也很多。从低功耗方面比较,51 的可选型号几乎没有,PIC单片机是低功耗的最低功耗也达个位数uA级,但MSP430单片机则是超低功耗的,最低功耗可达到0.6uA。需要说明一点的是,在执行了休眠指令后,PIC单片机每次唤醒都需要复位一次,所以在超低功耗方面MSP430单片机表现要好点。
当然MSP430单片机也有它的缺点,在我使用过程中,最大的不便就是位操作。
MSP430“系”出名门,作为一种16位混合信号处理器,其独到之处在于它的超低功耗,又由于其集成了硬件乘法器,信号处理能力比起8位机大大增强,在低功耗市场应用越来越多。尤其在中国,由于有利尔达信息技术公司的全力推广,应用范围更是越来越广,大有统治低功耗市场的架式。跳舞的人多了,本人就耐不住寂寞也想热闹一把。近来做的一个项目用了MSP430,顺便记下、抄下了一些笔记,在此与大家分享一下吧,虽然都很低级,但对于入门来说,不能说没有益处。我一向认为入门最重要,入了门想深入就靠自己造化,但是入不了门或者入错门,纵然你有万千智商也无用武之地。
1.MSP430系列并不是都有FLL、FLL+的,象X14X系列就没有。学习时要对此有个认识,如果有FLL则内部频率就比较稳定可以使用。对于14X系列DCO频率是不稳定的,误差大,所以最好是使用外部晶体
2.MSP430的端口命名从P0---P6,但不是每个器件都有这几个端口,有的器件只有P0--P4,有的只有P1--P6(msp430f147等)。P0口没有功能选择寄存器,这点要注意。
3.timer_A 的捕获/比较引脚和P1,注意是P1,复用,而P1有一个P1SELx的功能选择寄存器,用来选择其作为I/O还是作为timer_A使用
4. XT1、XT2、DCO都可以作为ACLK、 MCLK、 SCLK的时钟源,具体用哪一个可以从寄存器设置。当然你可以ACLK用XT1,MCLK用XT2,SCLK用DCO产生;也可以ACLK、MCLK都用 XT2,或者都用DCO产生也未尝不可,想怎么设置时钟都行,想到那儿就可以做到那儿呵呵
关于DCO分频控制的介绍:运用MOD参数进行调制,调制的具体含义为在32个DCO周期中插入频率为DCO+1的时钟信号,而插入的个数由MOD参数决定,其余为DCO信号,举例如下:
DCOCTL值为7AH时,DCO频率计算公式 (748×6+825×26)/32=811,748是DCO频率,825是DCO+1频率!!!!
这个算法是我的理解不知对否,还请高手指点。
5.Timer A当用作连续增计数模式时每个CCRx都可以产生中断,CCR0也没有什么特殊之处,这种方法用来产生多个定时的场合。
6. 430的RAM是个有趣的地方,它的存储一般从0200开始,字节存储没有特别的地方,而字存储就只能从偶地址开始,这点要特别注意,当进行类型变换时必须防止重要数据被覆盖。
7.我的总体感觉是搞清楚了430的时钟系统及其捕获比较的应用,基本就算入门了,其他方面无非就是寄存器设置还有技巧性的应用了,这方面只要做项目就会找到好的办法
申请到21IC的EK‐LM3S811评估板,非常开心。接下来几天开始搜集相关的资料文档,回到家开始了LM3S的初步相识。有了开发板,代码调试当然是第一步。
开发环境:
Keil uvision4
从最初学习51单片机时开始,接触的就是Keil,所以还是支持Keil。
下载工具:
LM Flash Programmer
Keil 软件中的Load 工具
遇到的问题:
1、关于编译器的视频,视频里讲解了mdk上每个选项的意思及 用法,适合初学mdk的同学们
地址:v.youku.com/.../id_XMjQwMDA5MDI0.html
2、 LM3S811提供的driver.lib库,想要弄明白每个函数是不可能的事情,最好的方式是一面看例程的程序流程,一面对应着Stellaris® Peripheral Driver Library USER’S GUIDE.PDF 文档来看,前期指导函数的作用就可以了。
3、 LM3S811防锁死,翻阅LM3S基本例程.PDF,有个底。有什么办法可以防止LM3S811锁死?
对于Sandstorm 家族(即 LM3S100、300、600、800 等) ,一旦JTAG接口因为误将其无防护地配置为 GPIO接口而被锁定,则有可能再也无法恢复。为了防患于未然,我们建议在编写每一个应用程序时都必须要在 main( )函数的开始处插入一段能够预防JTAG失效的代码。
参考:《LM3S基本例程》
4、 如何添加驱动driver.lib库?
浏览StellarisWare\ driverlib \ rvmdk driverlib选择库文件。注意,你需要把文件浏览器更改为寻找库文件类型,所以改变“文件类型的"下拉列表从“C源文件”到“库文件(* lib)”或“所有文件”。
突发奇想看看能不能写出彩色液晶屏来,哈哈,我试了试还可以啊,下面是代码:
#include "../inc/hw_ints.h"
#include "../inc/hw_memmap.h"
#include "../inc/hw_sysctl.h"
#include "../inc/hw_types.h"
这是在调用函数里面的,因为需要调用上一级目录的所以加上了"../" 这样才能够使用正确。
下面的是主函数的代码:
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#include "driverlib/systemInit.h"
这里用的定义,我们完全可以把以前所有的函数都来修改成这样的,方便调用,何乐而不为呢!
#define LCD_WR0 GPIOPinWrite(RW_PORT,RW_PIN,0); //写控制
#define LCD_WR1 GPIOPinWrite(RW_PORT,RW_PIN,RW_PIN);
#define LCD_RS0 GPIOPinWrite(RS_PORT,RS_PIN,0); //数据/命令切换
#define LCD_RS1 GPIOPinWrite(RS_PORT,RS_PIN,RS_PIN);
#define LCD_REST0 GPIOPinWrite(RST_PORT,RST_PIN,0); //复位
#define LCD_REST1 GPIOPinWrite(RST_PORT,RST_PIN,RST_PIN);
#define LCD_CS0 GPIOPinWrite(E_PORT,E_PIN,0); //片选
#define LCD_CS1 GPIOPinWrite(E_PORT,E_PIN,E_PIN); //片选关闭
#define LCD_RD1 GPIOPinWrite(RD_PORT,RD_PIN,RD_PIN); //读控制
/*定义液晶的数据端口*/
#define DBS_PERIPH SYSCTL_PERIPH_GPIOD
#define DBS_PORT GPIO_PORTD_BASE
#define DBS_PINS GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
上面的这句代码其实这里是我找了很久才发现的,这样写起来更简单,真是长见识了!!!
/*定义液晶数据命令选择端 */
#define RS_PERIPH SYSCTL_PERIPH_GPIOB
#define RS_PORT GPIO_PORTB_BASE
#define RS_PIN GPIO_PIN_0
/*定义液晶读写控制端*/
#define RW_PERIPH SYSCTL_PERIPH_GPIOB
#define RW_PORT GPIO_PORTB_BASE
#define RW_PIN GPIO_PIN_1
/*液晶使能端*/
#define E_PERIPH SYSCTL_PERIPH_GPIOB
#define E_PORT GPIO_PORTB_BASE
#define E_PIN GPIO_PIN_2
/*数据模式选择*/
#define RST_PERIPH SYSCTL_PERIPH_GPIOB
#define RST_PORT GPIO_PORTB_BASE
#define RST_PIN GPIO_PIN_3
/*数据模式选择*/
#define RD_PERIPH SYSCTL_PERIPH_GPIOB
#define RD_PORT GPIO_PORTB_BASE
#define RD_PIN GPIO_PIN_4
unsigned char image[3200]={ /* 0X00,0X10,0X28,0X00,0X28,0X00,0X01,0X1B, */
下载 (4.56 KB)
2011-11-16 13:07图片代码就省去了,在附件里面,大家可以下载下来看看!!!!!
};
下面的模式都是固定的了,凡是彩色液晶里面的都有,所以这些可以不用修改甚至不用看了,只要会调用函数就行了!
void delayms(int count) // /* X1ms */
{
SysCtlDelay(SysCtlClockGet()/6000);
}
//条件编译-8位数据模式
void LCD_Writ_Bus(char VH,char VL) //并行数据写入函数
{
GPIOPinWrite(DBS_PORT,DBS_PINS,VH);
LCD_WR0;
LCD_WR1;
GPIOPinWrite(DBS_PORT,DBS_PINS,VL);
LCD_WR0;
LCD_WR1;
}
void LCD_Write_COM(char VH,char VL) //发送命令
{
LCD_RS0;
LCD_Writ_Bus(VH,VL);
}
void LCD_Write_DATA(char VH,char VL) //发送数据
{
LCD_RS1;
LCD_Writ_Bus(VH,VL);
}
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>8,x1); //设置X坐标位置
LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1>>8,y1); //设置Y坐标位置
LCD_Write_COM(0x00,0x50);LCD_Write_DATA(x1>>8,x1); //开始X
LCD_Write_COM(0x00,0x52);LCD_Write_DATA(y1>>8,y1); //开始Y
LCD_Write_COM(0x00,0x51);LCD_Write_DATA(x2>>8,x2); //结束X
LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>8,y2); //结束Y
LCD_Write_COM(0x00,0x22);
}
void LCD_Init(void)
{
LCD_REST1;
delayms(5);
LCD_REST0;
delayms(5);
LCD_REST1;
LCD_CS1;
LCD_RD1;
LCD_WR1;
delayms(5);
LCD_CS0; //打开片选使能
//************* Start Initial Sequence **********//
LCD_Write_COM(0x00,0xE5); LCD_Write_DATA(0x78,0xF0); // set SRAM internal timing
LCD_Write_COM(0x00,0x01); LCD_Write_DATA(0x01,0x00); // set SS and SM bit
LCD_Write_COM(0x00,0x02); LCD_Write_DATA(0x07,0x00); // set 1 line inversion
LCD_Write_COM(0x00,0x03); LCD_Write_DATA(0x10,0x30); // set GRAM write direction and BGR=1.
LCD_Write_COM(0x00,0x04); LCD_Write_DATA(0x00,0x00); // Resize register
LCD_Write_COM(0x00,0x08); LCD_Write_DATA(0x02,0x07); // set the back porch and front porch
LCD_Write_COM(0x00,0x09); LCD_Write_DATA(0x00,0x00); // set non-display area refresh cycle ISC[3:0]
LCD_Write_COM(0x00,0x0A); LCD_Write_DATA(0x00,0x00); // FMARK function
LCD_Write_COM(0x00,0x0C); LCD_Write_DATA(0x00,0x00); // RGB interface setting
LCD_Write_COM(0x00,0x0D); LCD_Write_DATA(0x00,0x00); // Frame marker Position
LCD_Write_COM(0x00,0x0F); LCD_Write_DATA(0x00,0x00); // RGB interface polarity
//*************Power On sequence ****************//
LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x00,0x00); // SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x00,0x07); // DC1[2:0], DC0[2:0], VC[2:0]
LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x00); // VREG1OUT voltage
LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x00,0x00); // VDV[4:0] for VCOM amplitude
LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x00,0x01);
delayms(50); // Dis-charge capacitor power voltage
LCD_Write_COM(0x00,0x10); LCD_Write_DATA(0x10,0x90); // 1490//SAP, BT[3:0], AP, DSTB, SLP, STB
LCD_Write_COM(0x00,0x11); LCD_Write_DATA(0x02,0x27); // DC1[2:0], DC0[2:0], VC[2:0]
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x12); LCD_Write_DATA(0x00,0x1F); //001C// Internal reference voltage= Vci;
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x13); LCD_Write_DATA(0x15,0x00); //0x1000//1400 Set VDV[4:0] for VCOM amplitude 1A00
LCD_Write_COM(0x00,0x29); LCD_Write_DATA(0x00,0x27); //0x0012 //001a Set VCM[5:0] for VCOMH //0x0025 0034
LCD_Write_COM(0x00,0x2B); LCD_Write_DATA(0x00,0x0D); // Set Frame Rate 000C
delayms(50); // Delay 50ms
LCD_Write_COM(0x00,0x20); LCD_Write_DATA(0x00,0x00); // GRAM horizontal Address
LCD_Write_COM(0x00,0x21); LCD_Write_DATA(0x00,0x00); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
LCD_Write_COM(0x00,0x30); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x31); LCD_Write_DATA(0x07,0x07);
LCD_Write_COM(0x00,0x32); LCD_Write_DATA(0x03,0x07);
LCD_Write_COM(0x00,0x35); LCD_Write_DATA(0x02,0x00);
LCD_Write_COM(0x00,0x36); LCD_Write_DATA(0x00,0x08);//0207
LCD_Write_COM(0x00,0x37); LCD_Write_DATA(0x00,0x04);//0306
LCD_Write_COM(0x00,0x38); LCD_Write_DATA(0x00,0x00);//0102
LCD_Write_COM(0x00,0x39); LCD_Write_DATA(0x07,0x07);//0707
LCD_Write_COM(0x00,0x3C); LCD_Write_DATA(0x00,0x02);//0702
LCD_Write_COM(0x00,0x3D); LCD_Write_DATA(0x1D,0x04);//1604
//------------------ Set GRAM area ---------------//
LCD_Write_COM(0x00,0x50); LCD_Write_DATA(0x00,0x00); // Horizontal GRAM Start Address
LCD_Write_COM(0x00,0x51); LCD_Write_DATA(0x00,0xEF); // Horizontal GRAM End Address
LCD_Write_COM(0x00,0x52); LCD_Write_DATA(0x00,0x00); // Vertical GRAM Start Address
LCD_Write_COM(0x00,0x53); LCD_Write_DATA(0x01,0x3F); // Vertical GRAM Start Address
LCD_Write_COM(0x00,0x60); LCD_Write_DATA(0xA7,0x00); // Gate Scan Line
LCD_Write_COM(0x00,0x61); LCD_Write_DATA(0x00,0x01); // NDL,VLE, REV
LCD_Write_COM(0x00,0x6A); LCD_Write_DATA(0x00,0x00); // set scrolling line
//-------------- Partial Display Control ---------//
LCD_Write_COM(0x00,0x80); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x81); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x82); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x83); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x84); LCD_Write_DATA(0x00,0x00);
LCD_Write_COM(0x00,0x85); LCD_Write_DATA(0x00,0x00);
//-------------- Panel Control -------------------//
LCD_Write_COM(0x00,0x90); LCD_Write_DATA(0x00,0x10);
LCD_Write_COM(0x00,0x92); LCD_Write_DATA(0x06,0x00);
LCD_Write_COM(0x00,0x07); LCD_Write_DATA(0x01,0x33); // 262K color and display ON
LCD_CS1; //关闭片选使能
}
void Pant(char VH,char VL)
{
int i,j;
LCD_CS0; //打开片选使能
Address_set(0,0,240,320);
for(i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_Write_DATA(VH,VL);
}
}
LCD_CS1; //关闭片选使能
}
void init()
{
clockInit(); //系统时钟设置
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeriEnable(DBS_PERIPH);
GPIOPinTypeOut(DBS_PORT,DBS_PINS); //设置、使能DBS端口
SysCtlPeriEnable(RS_PERIPH);
GPIOPinTypeOut(RS_PORT,RS_PIN); //设置、使能RS端口
SysCtlPeriEnable(RW_PERIPH);
GPIOPinTypeOut(RW_PORT,RW_PIN); //设置、使能RW端口
SysCtlPeriEnable(E_PERIPH);
GPIOPinTypeOut(E_PORT,E_PIN); //设置、使能E端口
SysCtlPeriEnable(RST_PERIPH);
GPIOPinTypeOut(RST_PORT,RST_PIN); //设置、使能PBS端口
}
int main()
{
unsigned char k,j,i;
init();
while(1)
{
LCD_Init(); //TFT初始化
Pant(0xff,0xff); //TFT清屏
LCD_CS0; //打开片选使能
for(k=0;k<8;k++) //刷图片
{
for(j=0;j<6;j++)
{
Address_set(40*j,40*k,40*j+39,40*k+39);
for(i=0;i<1600;i++)
{
LCD_Write_DATA(image[i*2+1],image[i*2]);
}
}
}
LCD_CS1; //关闭片选使能
delayms(3000);
}
}
就是这样的一副图片,刷新速度比起单片机好太多了!
本人最初接触到的TI芯片是MSP430,是在暑假电子设计大赛培训期间,老师拿给我们开发板让我们做了一些简单的应用。
自己觉得印象最深,最有成就的是前一段时间21ic论坛举办的EK -LM3S811使用心得评奖活动
http://bbs.21ic.com/icview-298327-1-1.html(已结束)。当拿到板子的那一刻别说有多兴奋啊,听说过申请样片,送板子还真是第一次。拿到那块板子后,打开光盘,查找资料。做了几个简单模块的应用。首先是简单的LED跑马灯实验,然后就是有输入输出GPIO控制12864液晶,
还有串口调试助手模拟串口通信UART模块,
还有利用SSI模块采用三根线驱动8位数码管。最后综合定时器、SSI等模块采用定时器中断,外部中断,SSI模块,开关型霍尔传感器A04E制作了一个速度里程计,
上传到TI 网上商店,并通过了审核。http://shop.21ic.com/goods.php?id=134
期间肯定遇到了很多大大小小的问题,首先是如何把板子与电脑连起来,个人觉得按照光盘你的资料还是比较容易实现的,安装驱动,选择安装编程环境KEIL MDK,打开软件自带的代码(就是一个让等闪烁的代码,改变其中的一个数字,它闪烁速度也跟着变说明正常了)
第二就是查看资料,一个模块一个的学习,(再次还是推荐一本北航出的书吧:黄智伟. 32位ARM微控制器系统设计与实践——基于Luminary Micro LM3S系列CortexM3内核)
,该书有详细的模块讲解,主要是针对硬件结构的编程,而不是一开始直接调用库函数。对结构大致了解后就可以调用库函数进行一些编程了。这里需要注意的是包含头文件的写法以及头文件的位置。参考软件自带的代码。有时会出现找不到头文件的问题,原因是位置不对,你直接把驱动库要包含的头文件放到KEIL目录下就没问题了。
第三就是进行一些一些模块化编程,所写的源码都分享在了,21ic论坛,以上那个只传了几张照片。详细内容可以到http://bbs.21ic.com/frame.php?frameon=yes&referer=http%3A//bbs.21ic.com/space-username-nwx8899.html这里查看。
在附加两句,当我看到有9B96EVM板子时我又激动了!!!
至于要写采用TI MCU的设计经验总结和技巧心得;
采用TI MCU碰到的问题和后来的解决办法 还真不知道该怎么写,就此为止吧!!!
再次感谢TI这么给你的活动!大家积极支持啊!!!!
本人在大学期间参加过一个实验室开发项目,主题是基于zigbee的无线传感网络。首先我先贴出我那时候完成的报告的摘要:
本次实验研究,目的在于基于一种低速率,低功耗,短距离的无线网络协议,搭建一个实用可靠的无线传感网络,并验证无线传感网络在智能家居应用的可行性。本方案中选用由射频芯片与工业级C8051结合的CC2530作为无线微控芯片,附上温湿度传感器,基于Zigbee 2007搭建一个星型结构的无线传感网络。后期应用开发中,在传感节点中加入LED驱动电路,附上光照传感器与声音传感器,升级为多功能无线灯控网络。最后,我们基于VB开发了一套数据管理与控制软件,能够把从节点接收到的数据,通过串口传输至PC终端,最终显示到上位机中;并通过上位机发送控制命令,切换节点LED的显示功能模式,最终实现传感网络的全双工通信功能。
刚初次接触zigbee的时候,其实我第一款接触TI的产品不是CC2530,而是它的前身CC2430。其实CC2430就是一个工业级的8位51单片机+一个射频模块。刚开始那个月,基本多事熟悉单片机的操作,跑一下流水灯,中断,数码管之类的外设。后来熟悉了IO口与寄存器的操作之后,又外加了一些温度传感器,红外遥控之类的模块,并尝试编程控制。等单片机基本入门后,我就开始接触TI的ZStack;看这一些有关协议栈的文档与学习视频,进行了一个月左右的时间的学习;并在官方提供的例程Controller_Switch中学会了协调器建立网络,节点加入网络,绑定的流程。
待我基本熟悉协议栈ZDO与应用层的大概框架,我开始升级我的硬件装备,CC2530。CC2530的特性我也不多介绍,zigbee2007的协议栈功能更加完善,也修复了很多BUG。再后来,我学会了操作串口的中断,ADC的使用,还有定时器产生PWM信号等等。最终出色顺利完成项目。
LM3S811开发板移植周公UCOSII模板应注意问题
问题解决的有的东东非常简单,但找答案的过程是坚辛的,我想把这些心德写出来让大家少走些弯路。
周公的UCOS模板网上好找的,我现在说下移到LM3S811应注意的地方:
一:
#define EXT_CLK SYSCTL_XTAL_6MHZ 这个是在Target.h中,这个不修不行因为LM3S811开发板是6MHZ地
二:
加任务时一定要加那个任务表
static OS_STK Task_LedStk2[TASK_LED_STK_SIZE];
同时建立任务:
OSTaskCreate (taskLed2, (void *)0,
&Task_LedStk2[TASK_LED_STK_SIZE-1],
TASK_LED_PRIO2);
下边贴一下主要的程序,因为别的地方不需要改的:
/*********************************************************************************************************
VARIABLES 变量
*********************************************************************************************************/
static OS_STK Task_StartStk[TASK_START_STK_SIZE]; /* The stack of start task */
/* 启动任务的堆栈 */
static OS_STK Task_LedStk[TASK_LED_STK_SIZE];
static OS_STK Task_LedStk2[TASK_LED_STK_SIZE]; //这个一定要加上,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
/*********************************************************************************************************
FUNCTION PROTOTYPES 函数声明
*********************************************************************************************************/
static void taskStart (void *parg); /* The start task 启动任务 */
static void taskLed (void *parg);
static void taskLed2 (void *parg);
int main (void)
{
intDisAll(); /* Disable all the interrupts */
/* 关闭所有中断 */
OSInit(); /* Initialize the kernel of uC */
/* OS-II 初始化uC/OS-II的内核 */
OSTaskCreate ( taskStart,
(void *)0,
&Task_StartStk[TASK_START_STK_SIZE-1],
TASK_START_PRIO ); /* Initialize the start task */
/* 初始化启动任务 */
OSStart(); /* Start uC/OS-II 启动uC/OS-II */
return(0) ;
}
*********************************************************************************************************/
static void taskStart (void *parg)
{
(void)parg;
targetInit(); /* Initialize the target's MCU */
/* 初始化目标单片机 */
#if OS_TASK_STAT_EN > 0
OSStatInit(); /* Enable statistics */
/* 使能统计功能 */
#endif
/*
* Create the other tasks here. 在这里创建其他任务
*/
OSTaskCreate (taskLed, (void *)0,
&Task_LedStk[TASK_LED_STK_SIZE-1],
TASK_LED_PRIO); /* 初始化taskLed任务 */
OSTaskCreate (taskLed2, (void *)0,
&Task_LedStk2[TASK_LED_STK_SIZE-1],
TASK_LED_PRIO2); /* 初始化taskLed任务 */ //&&&&&&&&&&&&&&&&&&&&&&&&&&
while (1) {
OSTaskSuspend(OS_PRIO_SELF); /* The start task can be pended*/
/* here. 启动任务可在这里挂起 */
}
}
//以下是我建立的任务&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
static void taskLed2 (void *parg)
{
(void)parg;
while (1) {
ledOn(2); /* 点亮LED1 */
OSTimeDly(OS_TICKS_PER_SEC / 2); /* 延时0.5秒 */
ledOff(2); /* 关闭LED1 */
OSTimeDly(OS_TICKS_PER_SEC / 2); /* 延时0.5秒 */
}
}
最后在MDK编译通过。OK
到目前为此,也算是用过了TI的几款ARM芯片吧,只能算个小菜鸟。主要接触过LM3S8962,LM3S811,近期开发的一款产品用的是AM3517。
就简单描述一下我在使用上述芯片过程中遇到的一些问题与解决方法。
1、LM3S811 死锁,JTAG pin脚被当做io口使用时,会引起jtag死锁,无法恢复。所以在系统启动时,我加了一个按键扫描程序,检测到按键之后,不再进行后续程序的运行,从而可以使用jtag。
2、LM3S811评估板,usb2.0接口无法发现新硬件,导致找不到jtag,只好换了一个usb2.0接口。但之前这个usb接口是好的,是可以识别u盘的。这个目前都还未能找到合理原因。
3、LM3S811 AD值参考值有偏差。在原理图上始终没有找到ADC参考电压,认为3.3V就是参考电压,导致按这个电压计算10AD采样值的总是有少许误差。于是仔细去看datasheet,发现MCU内部参考电压是3.0V。数据手册一定要仔细看啊。
4、定时器溢出。本身我配置的timer1A产生100hz pwm方波,系统时钟频率为50Mhz,但因为16位定时器的表示范围是65535,而50Mhz/100=500000=0x7A120,它仅会保留低16位数据,所以实际配置变成了0xA120,产生的频率相应的也变成了50000000/0xA120=1212hz,不符合设计要求。
5、LM8962当时做一款产品,需用到RTC功能,掉电后还需要实时时钟走动,当时也咨询TI技术支持,并且也在deyisupport网上咨询过。
给的具体建议是:你可以查看HIbernation 功能描述部分,要使主芯片断电后RTC能继续工作,应当是用HIB引脚去控制主芯片掉电进入休眠模式。外部直接掉电而没有正确配置休眼模块RTC确实无法工作。
TI的休眠模块对于想使用RTC功能的应用来说确实很不好用,因会上电会复位配置。
最好的建议就是不要用它的RTC来做芯片掉电计时,弄个专门的RTC芯片好使得多,价格也便宜。
关于这点,TI的很多芯片好像都有这方面的通病,不知道是我不会用,还是确实不好用。
在此,也希望有经验的大侠与TI的工程师能指点迷津。(第5点与第2点)
首次接触TI产品是09年的春天,在美丽的海滨城市,邂逅了强大的2812.。我记得,那年我大三。那年,我才知道原来用DSP可以控制那么多东西,可以进行那么多那么复杂的运算。可惜,那时候由于水平有限,只能做简单的流水灯与数码管的小小程序。随后,加入DSP老师的学习小组,准备进行小项目的制作,由于KY,也只好作罢。
再次接触TI相关芯片,是去年。接触了TI的ARM芯片,发觉很不错!基于cortex m3架构的Stellaris,初接触,很不习惯使用库函数进行程序的编写,很苦恼。慢慢慢慢,发现,原来库函数并不是想象中的那么难。只要多了解库函数,就不用自己进行很多基础程序的编写,直接调用就好了。
今年,申请了挺多的TI的芯片进行学习,不过还没有完全学完,还在21ic论坛的活动中获得了TI的奖品,呵呵,小小高兴一下。2012 马上就要来了,希望下一年能好好完成学业与事业。
前一段时间一直在学习android,以后可能会从事android的硬件开发,所以对能支持android的cortex -A系列的产品挺感兴趣的,如果有机会,一定好好了解一下TI的cortex -A系列产品。
最后,祝TI来年更上一层楼,祝各位奋斗在电子战线上的同志们一切顺利。
看大家热情挺高涨,所以也就过来凑凑热闹吧。
大约09年开始接触28335这个片子,用起来还是很舒服的,记得那时候是毕业设计的课题使用的。现在依然还搞,不过这次是为了TI的MCU竞赛搞的。期间酸甜苦辣各自知。拿一小段出来与大家分享一下,互勉互励。
由于本次设计精度要求较高,综合分析评估发现TMS320F28335片上AD转换模块不能满足采样需求,因此需要外扩相应的AD模块。
设计方案:
基本思路为通过TMS320F28335外部扩展接口Xintf挂载高速AD转换芯片ADS805,然后通过DMA读取ADS805转换后的数据。
这样做的优点有:
1、通过DMA读取ADS805高速转换后数据,避免使用FIFO或者FPGA,降低成本,并且能够有效降低CPU资源消耗;
2、结合DMA的同步信号能够高速准确的读取数据,同时避免了使用中断的压栈和出栈耗时。
外围硬件设计:
1. 通过前置调理电路将输入信号调整为0-5V,以满足ADS805的信号输入范围。
2. ADS805的B1-B12分别和TMS320F28335的D11-D0相连。VDRV引脚与3.3V电源相连,提供输出参考电平。
时钟同步信号设计:
1. AD转换时钟信号CLK由DSP的ePWM产生。
测试中28335工作在150MHz,通过ePWM1A产生占空比为50%的时钟作为ADS805的始终信号。同时通过EPWM1SOCA产生与AD时钟信号反相的同步信号,作为DMA的触发源。
2. ADS805输出使能信号OEn由GPIO输出得到。
测试说明:
1. 系统时钟设置为150Mhz。
2. 使用DMA1通道读取地址0x200000(Zone7)的内容,存储在数组ADC_Result中。DMA触发源设置为EPWM1的EPWM1SOCA,总线配置为16位传输方式。DMA传输完毕后触发中断,对读取的数据进行处理。
3. 通过图形窗口观察读取到数据的波形。
问题总结及展望:
1. 由于转换的数据需要实时读取,而且每次只读取一个字的数据,因此DMA配置时,需要将BURSTSIZE配置为0,也就是保证每次触发DMA只传输一个字。如果此值设置过大,会造成周期性的数据读取错误。而且相邻两点可能产生数据重复现象,即同一数据重复读取。
2. 由于没有最小系统板没有扩展CPLD,因此ADS805输出使能信号直接使用GPIO输出,而不是通过与地址线译码产生。这样就会造成在AD转换期间,数据总线会一直被占用,直到数据转换完成。
3. 通过ePWM产生的时钟信号勉强能够满足ADS805时钟信号的特征要求。但是这个信号最好添加驱动芯片以改善波形,消除线冲的影响。
4. Xinf读取周期配置中,建立时间要大一点,不然会出现意外的数据错误。
写一下自己28335的学习经历吧。本科的时候接触的主要是51,后来c2000竞赛的缘故,直接升到28335进行学习。第一感觉有些难,最全的资料就是TI的技术手册了。中文的资料和书籍可以说是凤毛麟角。一路上磕磕碰碰还是把竞赛整完了。虽说没得什么大奖,但对28335还是基本上掌握了。
很多人都说28335是2812的升级版。可是对没接触过2812的人来说,此话又有什么意义。总不能为了学习28335先去费尽功夫把2812掌握好了再来。下面介绍一下自己的学习经历,供后来者借鉴参考。资料呢,推荐三样:ti的技术文档自然排第一,再就是两本书:TMS320x28xxx和TMS320F28x源码解读。
首先技术文档这个还是必须读的,最原汁原味的东西了。比任何其他的东西说的都清楚明了。在读文档的时候可以借鉴参考上面提到的两本书经行交叉对比的学习。这样的效率要高一些。
祝各位工作顺利 学习进步!
LM3S811 SSI操作5110屏
我觉得LM3S系列的SSI就是常说的SPI。只不过叫法不同
5110的屏大家很常见,一般的是用模拟SPI点亮的,我用LMS8962的SSI点使5110显示了,,由于我走了不少弯路,所以写出来让大家少走点弯路!
一般按以下步骤操作LM3S8962
1,系统时钟设定:
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ);
2,SSI使能,这个有点门道,一使能就必须规定哪个脚使用,不用的脚不声明,而且功能是固定的
例如:我不用第PORTA.4脚,我可以不声明
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5);
一但声明每个脚做什么的是固定的
3,配置SSI
// Configure and enable the SSI0 port for master mode.
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_2,
SSI_MODE_MASTER, 9600, 8);
这个很重要其中SysCtlClockGet(),看说明文档应是大于或等于后边的波特率地/2,这个设不对一定不好用地
4,再补充一下哈:写完后应有个等待,或哑读,我用的是延时,用哑读也可以地,我看例程用的是什么哑读,
我想就是延时,嘿嘿!
#include "hw_types.h"
#include "hw_ssi.h"
#include "hw_gpio.h"
#include "hw_memmap.h"
#include "debug.h"
#include "sysctl.h"
#include "gpio.h"
#include "ssi.h"
#include "5110.h"
extern unsigned long TheSysClock;
unsigned char sfbuf[10];
//*****************************************************************************
//
// Macros that define the peripheral, port, and pin used for the OLEDDC
// panel control signal.
//
//*****************************************************************************
#define SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOA
#define GPIO_OLEDDC_BASE GPIO_PORTA_BASE
#define GPIO_OLEDDC_PIN GPIO_PIN_6
#define GPIO_OLEDEN_PIN GPIO_PIN_7
//片选:PA3
//复位:PA4
//命数:PC6
//数、命令初使化
void GPIOCInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能GPIOC
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_6);
GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_6,
GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,(1<<6));
}
void command(void)
{
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,(0<<6));
}
void data(void)
{
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,(1<<6));
}
//
//pa4
void reset(void)
{
unsigned int i;
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,(0<<4));
for(i=0;i<1000;i++);
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,(1<<4));
}
void LCD_write_byte(unsigned char send_data, unsigned char cmd_or_data)
{
unsigned char i;
if(cmd_or_data==0)
command();
else
data();
for(i=0;i<100;i++)
;
SSIDataPut(SSI_BASE,send_data);
for(i=0;i<100;i++) //对于LM3S的 SPI 驱动 5100 LCD的应用中,数据通过SPI传送完成后,一定需要再延时一小段时间,再将LCD的 CS 置为高。
; //否则显示不正常,延时时间的长短需要根据SPI的 拨特率及系统的运行频率来共同定
}
void delay(unsigned long uld)
{
for(;uld;uld--);
}
/*----------------------------------------------------------*\
| PCD5544 put a character |
\*----------------------------------------------------------*/
void LCD_Putchar(unsigned char character) { //显示ASCII值的字符
unsigned char i=0;
unsigned int No;
No=character-32; //字模数据是由空格开始,空格字符的ASCII的值就是32
No=No*5; //每个字符的字模是5个字节
while(i<5) { //一个字符的字模是5个字节,就是5*8点阵
LCD_write_byte(ASC2[No],1);
i++;
No++;
}
LCD_write_byte(0,1); //每个字符之间空一列
delay(1);
}
/*----------------------------------------------------------*\
| PCD5544 print string |
\*----------------------------------------------------------*/
void LCD_PrintStr(unsigned char *s) { //显示字符串
while( *s ) {
LCD_Putchar( *s++ );
}
}
int main(void)
{
unsigned int i;
//
// Set the clocking to run directly from the crystal.
//
GPIOCInit();
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ);
//
// Enable the SSI0 and GPIO port blocks as they are needed by this driver.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIO_OLEDDC);
//
// Configure the SSI0CLK and SSIOTX pins for SSI operation.
//
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5);
GPIOPinTypeGPIOOutput(GPIO_OLEDDC_BASE, GPIO_PIN_4);
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4|GPIO_PIN_5,
GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
//
// Configure and enable the SSI0 port for master mode.
//
SSIConfigSetExpClk(SSI0_BASE,2400 , SSI_FRF_MOTO_MODE_3,
SSI_MODE_MASTER, 1200, 8); //SysCtlClockGet()
//
// Enable the SSI port.
//
SSIEnable(SSI0_BASE);
reset();
LCD_write_byte(0x21,0);
LCD_write_byte(0xd0,0);
LCD_write_byte(0x20,0);
LCD_write_byte(0x0c,0);
for(i=0;i<550;i++)
{
LCD_write_byte(0xFF,1);
}
delay(10000);
for(i=0;i<550;i++)
{
LCD_write_byte(0x00,1);
}
LCD_write_byte(0x41,0);
LCD_write_byte(0x8F,0);
LCD_PrintStr(" HELLO!");
LCD_write_byte(0x43,0);
LCD_write_byte(0x8E,0);
LCD_PrintStr("EEWORLD!!!");
}
我也来回下帖子
初步接触TI是接触到它的高速AD芯片TLC5510,因为当时做飞思卡尔比赛要用这个芯片来对摄像头读回来的值进行AD转换,只需要给该芯片一个20MHz的采样频率就能从芯片读出数字量。但是最初用这个芯片的时候碰到了一个问题,呵呵,多次尝试终于发现了一个很菜的问题,那就是DGND和AGND没有做区分,后来AGND和DGND通过一个0欧电阻隔离后,读出来的数据就很稳定了。吸取这次教训,以后再也不敢不区分模拟地和数字地了,当时纠结了太久,后怕啊。。。
再次接触到TI MCU是接触的MSP430单片机,那时候暑假提前返校准备参加2011年的电子设计竞赛,学校老师给我们每个组都发了一块MSP430的开发板,整天就看视频学习,看的力天电子做的430视频。
各个模块都学的差不多了,电子设计竞赛就来了
看了各个组别的题目,发现可能B题要适合我们一点
毕竟单摆相对于我们团队来说比较好实现一点,用430单片机自带的12位ADC完全能够将角度传感器的角度值转换过来
那几天忙着做单摆架子,忙着搭电路,几天都没好好睡过
呵呵
相对于那几天的收获(ps:最后得了个省二等奖,程序没写好,呵呵),觉睡不睡也不在乎了
期间也遇到一个问题,键盘不能用,呵呵
不过没一会儿就发现问题了,没给单片机端口加上拉电阻,读出来的始终是低电平,加上上拉电阻后就能正确地读了
这就是一个不断学习的过程,把2011参加电赛的电路图以附件贴出来
后来又通过21IC申请到了TI的一块LM3S811的评估套件,非常感谢TI,只是目前没什么时间弄了,因为马上期末考试得好好看书了,以后学习了就上传学习笔记
还从TI申请了两次样片,TI公司真是太大方了,给了我们这些没多少钱买元件的穷学生很大的帮助,让我们有可能接触到高级的东西
TI的芯片用过不少,对于学生来讲,TI还是很大方的,我们可以申请到样片试用和学习,大学期间用到比较多和印象深刻的主要是MSP430单片机,用在了三个地方,一个是2010年的TI杯电子设计大赛,记得当时选的题目是控制类的点光源跟踪系统,用的是MSP430F149的芯片,主要完成对光传感器采集的信号进行处理并控制步进电机寻找点光源,当然其中还有一定的控制算法。用下来觉得芯片很好用,编程也很方便(用的是IAR环境)节省了我们很多时间,因为TI430的例程很多帮助很大。第二个是学校的STITP项目(大学生科技创新计划)——智控LED日光灯,其实跟电赛差不多,也是采集光信号,这个项目控制的是LED灯的电流,也很好地完成了项目。最后一个是公司的项目——病虫害统计器(手持终端)由于对于功耗的要求比较高,所以当时就想到了430单片机,前面有了一定的基础了,开发起来也比较方便,但是一用就遇到问题了,由于统计器需要输入很多信息显示和存储,普通的1602LCD或12864LCD都不太够,需要用TFT屏来显示,但是MSP430F149的主频最高才8M对于TFT屏来说太低,刷新频率不够,所以得放弃并行方式的普通TFT屏,最终我们寻找到一款串行的TFT屏(它里面已集成了一块STM32F103芯片),刷屏和显示都有屏本身处理,430只需发送特定的数据,就可以显示汉字、图片,节省了不少空间和资源,但也带来了成本的增加,不过还好,最终还是完成了,整体达到要求,现在准备用cotexM3的片子升级一下。感谢TI提供的样片,给我们试用学习。在新的一年到来之际,希望TI越做越好。
我是在大一下学期在查找51资料时看到网友讨论MSP430的,那时的我51刚入门,觉得这种MCU肯定很难学,心里想还是学好51吧,这种芯片学起来定是又贵又费钱。由于学习51初期要查找很多资料,经常逛各种论坛,慢慢的学MSP430的人很多,网上资料也很多,而且慢慢了解这款芯片的生产厂家TI,了解到其在我国的半导体市场的占有率,心里萌生了学习这种MCU的想法,但网上MSP430的板子并不便宜,学习的计划就这样拖了几个月。再后来我发现TI可以申请样片,抱着试试的态度,我申请了MSP430F149,第二天就收到了TI发来的申请通过的邮件,和发货单号。过了几天就收到了样片。芯片包装的很好,放在一个小盒子里,有两个海绵保护着。在EDN的“MSP430助学小组”我申请了一块msp430的空板,完成焊接后,就用这个板子断断续续学了起来,在学习TI芯片的过程中我又学了MSP430f5438。在这过程中我慢慢体会到MSP430系列的MCU的低功耗的含义,真的做的很好,这些归功与灵活的时钟设置吧!
大二下学期,我以MSP430f5438设计的“建筑能源采集管理系统”申请到了省创新性试验项目的立项,并获得了资助,现在项目快结题题验收了。这还要感谢TI的样片,是他带我进入了低功耗的世界,没有学习msp430我也不回有申请到项目的契机。现在我大三了,希望下学期学一下TI的DSP和ARM,我相信这些定会很有前景,因为TI从做了没那么多活动,非常在乎中国的半导体市场,而且他的占有量也非常大。
在学习的路上也有很多的小插曲,在eeworld网上团购MSP430的luanchpad才25元,是在不错,用这个小板我做了个“心率仪”还获得了一等奖,呵呵呵!
说起采用TI MCU的设计经验总结和技巧心得,碰到的问题和后来的解决办法,一直也没有一个好的思路去总结一下,这样吧,我就讲以前设计的一个项目吧,因为是商业产品所以不能开源,还请见量.我就讲一下过程序中的问题点和解决办法吧,先上几张产品的照片吧
以上为产品的照片,下面是软件的简易流程图,算是给大家一个参考吧
此控制系统是控制灯饰景观类灯具的,主控制器为两种功能,一为接收PC机通过以太网传过来的数据,并转换成从机所需的数据格式,并且发送给从机.二为读取SD卡内数据,并转换成从机所需的数据格式,并且发送给从机.从机负责实现扫描显示部份.
刚刚开始设计此控制系统时,完全采用库函数方式编程,处理速度很慢,特别是GPIO部份,与使用寄存器方式比慢上几倍的速度,而且针对一些特殊操作,灵活度不高,而完全使用寄存器方式编程,所耗时间同精力都非常大,而此产品对CPU的速度又要求特别高,后来的解决办法是,采用折中方法,使用库函数方式初始化各模块功能,采用寄存器方式编写处理和输入输出程序,此方法即有效利用库函数的强大功能,又提升了输入输出时操作时的速度.还减少了只使用寄存器方法的容易产生的设置错误.
还有一个问题就是LM Flash Programmer有时候会突然打不开,没办法使用,解决方法是在 运行里输入regedit,然后在HKLM\Luminary Micro\LMIFlash\QuickSet里将value 改为0,再次打开LM Flash Programmer,就没有问题了
再有就是LM-LINK(主芯片为FT2232D)在windows7系统下面的支持度非常差,仿真一次程序,需要多次插拔USB线,编译器才能识别仿真器,无论是在IAR下还是MDK下都一样,在windowsXP系统下有些电脑的识别也比较差,不过比较windows7下面情况要好很多了,以前没办法解决此现像,现在重新买了个采用LM3S3601设计的仿真器,就无此现像了,大家如果碰到此现像,建议重新买个仿真器或者使用JLINK进行仿真调试.
再有就boot_loader程序,刚刚开始学的时间水平比较低,不清楚怎样使用,如果一开始就建好的工程和BIN文件,以及使用说明,就非常有利于初学者入门,我是从代理商讨来的一份程序,软件库里也有,可我不会用,呵呵
就先写到这吧,有好多问题随着不断的进步,都慢慢解决了,有的已经想不来了,可能现在都不是问题了.等想起来时,我再补充吧.看到9B96EVM板子流口啊!!! 呵呵
看到好多同仁都发布一些程序上来,我也凑个热闹,以下是我利GPIO模拟IIC方法控制OLED屏的程序,里面有注解哦
#include"systemInit.h"
//void Initial_LY096BG30();
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
//void Picture_1();
//void IIC_Start();
//void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
/***********************Initial code*********************/
void Initial_LY096BG30()
{
Write_IIC_Command(0xAE);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
Write_IIC_Command(0x40);
Write_IIC_Command(0x81);
Write_IIC_Command(0x8f);
Write_IIC_Command(0xa1);
Write_IIC_Command(0xa6);
Write_IIC_Command(0xa8);
Write_IIC_Command(0x3f);
Write_IIC_Command(0xc8);
Write_IIC_Command(0xd3);
Write_IIC_Command(0x00);
Write_IIC_Command(0xd5);
Write_IIC_Command(0x80);
Write_IIC_Command(0xd9);
Write_IIC_Command(0x22);
Write_IIC_Command(0xda);
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb);
Write_IIC_Command(0x40);
Write_IIC_Command(0x8d);
Write_IIC_Command(0x14);
Write_IIC_Command(0xaf);
};
/***********************Picture Code**************************/
unsigned char show[]={
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X42,0X72,0X2E,0XA2,0X3A,0X62,0X30,0X7C,0X8A,0X08,0X08,
0XF8,0X08,0X00,0X44,0X44,0XFC,0X44,0X04,0X40,0X5C,0X50,0X50,0XDE,0X50,0X50,0X50,
0X5C,0X40,0X00,0XFE,0X02,0X4A,0X4A,0X4A,0X4A,0XFA,0X4A,0XCA,0X4A,0X4A,0X02,0XFE,
0X00,0X00,0XFE,0X02,0X72,0X8E,0X20,0X22,0X22,0X22,0XE2,0X22,0X22,0X22,0X22,0X20,
0X08,0X88,0X88,0XC8,0XA8,0XB8,0XAE,0XA8,0XA8,0XA8,0XA8,0XA8,0XE8,0X08,0X08,0X00,
0XFE,0X02,0X7A,0X86,0X00,0XFE,0X4A,0X4A,0XCA,0X4A,0X4A,0XFE,0X00,0X00,0X80,0XC0,
0X60,0X10,0X0C,0X02,0X80,0X00,0X02,0X0C,0X10,0X20,0X40,0XC0,0X80,0X00,0X10,0X92,
0X92,0X92,0X92,0X92,0X92,0X92,0X92,0X12,0X12,0X02,0XFE,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X22,0X22,0X22,0X1F,0X12,0X12,0X30,0X30,0X1B,0X0C,0X0F,
0X10,0X30,0X20,0X10,0X10,0X0F,0X08,0X08,0X3F,0X01,0X01,0X1F,0X01,0X3F,0X21,0X21,
0X3F,0X00,0X00,0X3F,0X10,0X14,0X14,0X14,0X14,0X17,0X14,0X15,0X17,0X14,0X10,0X3F,
0X00,0X00,0X3F,0X08,0X08,0X0F,0X10,0X0E,0X23,0X20,0X3F,0X00,0X00,0X03,0X0E,0X18,
0X01,0X00,0X00,0X3F,0X04,0X04,0X04,0X04,0X04,0X24,0X24,0X24,0X3F,0X00,0X00,0X00,
0X3F,0X04,0X04,0X07,0X00,0X3F,0X10,0X10,0X09,0X06,0X0C,0X12,0X31,0X20,0X00,0X20,
0X30,0X28,0X24,0X23,0X10,0X10,0X10,0X12,0X14,0X18,0X20,0X00,0X00,0X00,0X00,0X1F,
0X08,0X08,0X08,0X08,0X08,0X08,0X2F,0X20,0X20,0X20,0X3F,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X80,0X90,0X90,0X90,0XD0,0XB0,0X98,0X90,0X90,0X90,0X90,0X90,
0X90,0X90,0X80,0X00,0XC0,0X80,0X00,0X00,0XF8,0X00,0X00,0X00,0XF8,0X00,0X00,0X00,
0XC0,0X00,0X00,0XE0,0X20,0X30,0X28,0X20,0XE0,0X80,0X70,0X38,0X20,0X20,0X20,0XE0,
0X00,0X00,0X90,0X90,0XD0,0XD0,0XB0,0XB0,0X90,0X90,0X90,0X88,0XC8,0X48,0X08,0X00,
0X80,0X40,0X30,0X88,0X80,0X20,0X20,0XA0,0XE0,0X68,0X30,0XA0,0X20,0X20,0X20,0X20,
0X20,0XF8,0X20,0X20,0X00,0XF8,0XA8,0XA8,0XA8,0XA8,0XA8,0XF8,0X00,0X00,0X00,0X80,
0XC0,0X30,0X08,0X20,0X20,0XF8,0X20,0X20,0X20,0XF8,0X20,0X20,0X00,0X20,0XA0,0XA0,
0XE0,0XE0,0XA0,0XA8,0XB0,0XA0,0XE0,0XE0,0XA0,0XA0,0X20,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X16,0X15,0X24,0X24,0X44,0X64,0XB4,0X94,0X0C,
0X04,0X00,0X00,0X80,0X80,0X83,0X8C,0X80,0XFF,0X80,0X80,0X80,0XFF,0X80,0X8C,0X87,
0X80,0X80,0X00,0XFF,0X42,0X42,0X42,0X42,0XFF,0X00,0X02,0X84,0X88,0X80,0X80,0X7F,
0X00,0X80,0XC8,0X68,0X2C,0X1C,0X8A,0X8A,0XF9,0X09,0X09,0X1A,0X2C,0X6C,0X48,0X90,
0X49,0X2F,0X25,0X95,0X94,0X42,0X23,0X1E,0X02,0X02,0XFE,0X82,0X83,0X82,0X74,0X84,
0X82,0XFF,0X02,0X81,0X62,0X3A,0X42,0XC2,0XFE,0X92,0X92,0X92,0X82,0X00,0X03,0X01,
0XFF,0X00,0X84,0X44,0X24,0X17,0X04,0X04,0X04,0X17,0X24,0X44,0X84,0X00,0XFF,0X04,
0X04,0X7A,0X2A,0X28,0X28,0X2A,0XBA,0X84,0X84,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
unsigned char show1[]={
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0X40,0X40,0X20,0X20,0X00,0X00,
0X00,0X1C,0X9C,0X9C,0XDC,0XDC,0XEC,0XEC,0XEC,0XEC,0XEC,0XEC,0XE8,0XE8,0XE8,0XE8,
0XE8,0XE8,0XEC,0X64,0XB4,0XF6,0XF6,0X76,0XB6,0XC6,0XFE,0XFE,0XFE,0XFE,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X07,0XF7,0XF7,0XF7,0X37,0XD7,0XD7,0XD7,
0XD6,0XD6,0XD6,0XD6,0XD6,0XD6,0XD6,0XEE,0XAC,0XAC,0X6C,0XEC,0XDC,0XD8,0XB8,0XB8,
0X78,0XF0,0XF0,0XF0,0XF0,0XE0,0XE0,0XC0,0XC0,0XC0,0X80,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0,0XE0,0X70,
0X38,0X18,0X0C,0X04,0X06,0X02,0X81,0XC1,0XE0,0XF0,0XF0,0XF8,0XFC,0XFC,0XFE,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0XBF,0X9F,0XEF,0XF7,
0X3B,0X9D,0XCE,0XF7,0XFB,0XFD,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0X99,0XE7,0XFF,0XFF,
0X3E,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFE,
0XFC,0XFC,0XF8,0XF0,0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X80,0XE0,0XF0,0XF8,0XFC,0XFE,0X3F,0X1F,0X07,0X03,0X01,0X00,0X00,
0XC0,0XF0,0XF8,0XFC,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0X7F,0XBF,0XDF,0XEF,0X77,0XBB,0XDD,0XEE,0XF7,0XFB,0XFD,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XFF,0X1F,0XFE,0XF5,0XF5,0XF5,
0XF5,0XF5,0XF5,0XF5,0XED,0XDD,0X3D,0XFD,0XED,0XDE,0X7A,0XFB,0XFB,0XFD,0XFD,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XC0,0X00,0X00,
0X00,0XF8,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0X00,0X00,0X00,0X00,0X00,0XF8,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X4F,
0X77,0X7B,0X7D,0X4E,0X77,0X3B,0X3D,0X3E,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XBF,
0XBF,0XBF,0XBF,0XBF,0XBF,0XBF,0XBF,0XBF,0X3F,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XFF,0X00,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0XFB,0XE7,0XDF,0X3C,0XFB,0XEF,0X9F,0X7F,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
0X01,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XE0,0X80,0X00,0X00,0X00,0X07,0X3F,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0X7F,0X7F,0X7F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X7F,0XBF,0XDF,0XE0,0X7F,0XBF,0XC4,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0X03,
0X00,0X00,0X00,0X03,0X07,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,
0XC0,0XC1,0X87,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFE,0XFE,0XFD,0XFB,0XFB,0XF6,0XF6,0XEE,0XEE,0XEE,0XDE,0XDE,0XCA,
0XAA,0X9A,0X9A,0X9A,0X3A,0X3A,0X3A,0X3C,0X3D,0X3D,0X7D,0X7D,0X7D,0X7D,0X7D,0X7D,
0X7D,0X7D,0X7D,0X7D,0X7D,0X7D,0XBD,0XBD,0XBD,0X3D,0X3D,0X5F,0X5F,0X5F,0XAF,0XAF,
0XAF,0XF7,0XD7,0XDB,0XEB,0XED,0XFD,0XF6,0XFB,0XFB,0XFD,0XFE,0XFE,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X01,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,0X07,0X0F,
0X0F,0X1F,0X1F,0X3F,0X3F,0X7E,0X7C,0XFC,0XF8,0XF9,0XF3,0XF7,0XE7,0XEF,0XCF,0XDF,
0XDF,0XBF,0XBF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFE,0XFE,0XFE,
0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X7F,0X3F,0X3F,0X1F,0X1F,0X0F,
0X0F,0X07,0X07,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X03,0X03,0X03,
0X07,0X07,0X07,0X07,0X0F,0X0E,0X0E,0X0F,0X1D,0X1D,0X1D,0X1B,0X1B,0X1B,0X3B,0X37,
0X37,0X37,0X37,0X37,0X3F,0X6F,0X6F,0X6F,0X6F,0X6F,0X6F,0X5F,0X5F,0X5F,0X5F,0X5F,
0X5F,0X5F,0X5F,0X5F,0X5F,0X7F,0XBF,0XBF,0XBF,0XBF,0XBF,0X3F,0X3F,0X7F,0X5F,0X5F,
0X5F,0X5F,0X5F,0X5F,0X5F,0X4F,0X4F,0X4F,0X4F,0X4F,0X4F,0X67,0X67,0X27,0X27,0X23,
0X23,0X23,0X23,0X21,0X21,0X01,0X10,0X10,0X10,0X10,0X00,0X00,0X00,0X08,0X08,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
unsigned char show2[]={
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,
0X80,0X00,0XC0,0XE0,0XF0,0X70,0X38,0X38,0X18,0X1C,0X1C,0X1C,0X1C,0X98,0XF8,0XF8,
0XF0,0XE0,0X60,0X38,0X18,0X1C,0X1C,0X0E,0X0E,0X0E,0X0F,0X8F,0XCF,0XFF,0X7E,0X38,
0X38,0X38,0X1C,0X1C,0X1C,0X1E,0X1E,0X1E,0X1E,0X3E,0X3E,0X7C,0XFC,0XFC,0XF8,0XF8,
0XF0,0XC0,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XF0,0X1C,0X0C,0X07,0X03,0X01,0X01,0X00,0X00,0X01,0X01,0XFF,0XFF,
0X1F,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0XF0,0XF8,0X3E,0X0F,0X07,0X03,
0X01,0X00,0X00,0X00,0X00,0X00,0XC0,0X30,0X08,0X0C,0X02,0X01,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X1F,
0XFF,0XFF,0XFF,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,
0X80,0X80,0X80,0X80,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,0XC0,
0XC0,0XC0,0X80,0X80,0X80,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XFF,0X00,0X00,0X20,0X20,0XC0,0XC0,0X00,0X00,0X00,0X80,0XFF,0X03,
0X00,0X00,0X20,0X00,0XC0,0X00,0X00,0X00,0XFE,0XFF,0X0F,0X03,0X00,0X20,0X20,0X40,
0X80,0X00,0X00,0X00,0XFE,0XEF,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0XC0,0XF0,0X38,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,
0XFF,0XEF,0X6F,0X70,0X38,0X38,0X38,0X1C,0X1C,0X1E,0X1E,0X0E,0X0F,0X0F,0X0F,0X0F,
0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X03,0X03,0X03,0X03,0X03,0X03,
0X07,0X07,0X07,0X07,0X07,0X0F,0X0F,0X0F,0X1F,0X1F,0X1E,0X3E,0X3C,0X7C,0X78,0XF8,
0XF0,0XF0,0XE0,0XC0,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X80,0XFF,0XF8,0XE0,0XC0,0XC0,0XC1,0XC3,0XE0,0X78,0X78,0XFF,0XFF,0XE0,
0XC0,0X80,0X80,0X80,0X87,0XC0,0XF0,0XF8,0XFF,0XFF,0XC0,0X80,0X80,0X80,0X80,0X90,
0XC7,0XC0,0XE0,0XFE,0XFF,0X00,0X00,0X00,0X00,0X01,0X01,0X3E,0X00,0X00,0X00,0X80,
0XC0,0XE0,0X7E,0X1F,0X0F,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X01,0X03,0X03,0X07,0X0F,0X1E,0X3E,0X7C,0XF0,0XE0,0XC0,0X00,0X00,0X00,0X00,
0XFC,0XFF,0XFF,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X81,
0XC1,0X3F,0X0F,0X03,0X03,0X01,0X00,0X00,0X00,0X01,0X01,0X03,0X03,0X03,0X03,0X01,
0X01,0X00,0X00,0X00,0X01,0X01,0X02,0X04,0X04,0X04,0X04,0X04,0X06,0X06,0X07,0X03,
0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X0F,0X7F,0XFC,0XF0,0X00,
0X01,0X0F,0X1F,0X78,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0X80,0XC0,0XC0,0X40,0X40,0X40,0X40,0X40,
0X40,0XC0,0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFE,
0X00,0X00,0X00,0X00,0X83,0XC7,0XFC,0X70,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0X00,
0X00,0X00,0X80,0XC0,0X60,0X00,0X00,0X80,0X80,0X80,0X80,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X80,0XC0,0XC0,0X60,0X30,
0X30,0X18,0X08,0X0C,0X04,0X06,0X02,0X02,0X01,0X01,0X01,0X01,0X01,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X01,0X01,0X01,0X01,
0X01,0X01,0X00,0X02,0X02,0X02,0X03,0X03,0X04,0X04,0X04,0X0C,0X08,0X08,0X18,0X18,
0X10,0X30,0X30,0X60,0X61,0X61,0XC1,0XC2,0XC0,0X84,0X84,0X80,0X00,0X00,0X40,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0XE0,0XF0,0X7C,0X3F,0X1F,0X03,
0X00,0X08,0X08,0X0C,0X07,0X03,0X01,0X00,0X00,0X00,0X00,0X06,0X02,0X01,0X01,0X01,
0X01,0X01,0X01,0X00,0X00,0X06,0X03,0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X40,0XE0,0XE0,0X70,0X38,0X18,0X1C,0X0E,0X07,0X03,0X01,0X01,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X03,0X03,0X07,0X06,
0X06,0X06,0X06,0X06,0X06,0X07,0X03,0X03,0X03,0X01,0X00,0X00,0X00,0X00,0X00,0X00,
};
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{
// SCL = high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//控制SCLK(D0)管脚为高电平
// SDA = high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,~0);//控制MOSI(D1)SDA 管脚为高电平
// SDA = low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0); //控制MOSI(D1)SDA 管脚为低电平
// SCL = low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);//控制SCLK(D0)管脚为低电平
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
// SCL = low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);//控制SCLK(D0)管脚为低电平
// SDA = low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0); //控制MOSI(D1)SDA 管脚为低电平
// SCL = high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//控制SCLK(D0)管脚为高电平
// SDA = high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,~0);//控制MOSI(D1)SDA 管脚为高电平
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char dat)
{
unsigned char m,da;
unsigned char j;
da=dat;
for(j=0;j<8;j++)
{
m=da;
// SCL=low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);//控制SCLK(D0)管脚为低电平
m=m&0x80;
if(m==0x80)
{
// SDA=high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,~0);//控制MOSI(D1)SDA 管脚为高电平
}
else
{
// SDA=low;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0); //控制MOSI(D1)SDA 管脚为低电平
}
da=da<<1;
// SCL=high;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//控制SCLK(D0)管脚为高电平
}
// SCL=0;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0);//控制SCLK(D0)管脚为低电平
// SCL=1;
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~0);//控制SCLK(D0)管脚为高电平
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00); //write command
Write_IIC_Byte(IIC_Command);
IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40); //write data
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}
/********************************************
// fill_Picture
********************************************/
void fill_picture(unsigned char fill_Data)
{
unsigned char m,n;
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
Write_IIC_Command(0xb0);
for(m=0;m<8;m++)
{
Write_IIC_Command(0x00); //low column start address
Write_IIC_Command(0x10); //high column start address
Write_IIC_Command(0xb0+m); //page0-page1
for(n=0;n<128;n++)
{
Write_IIC_Data(fill_Data);
}
}
}
/******************************************
// picture
******************************************/
void picture(void)
{
unsigned char x,y;
unsigned int i=0;
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(y=0;y<8;y++)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(x=0;x<128;x++)
{
Write_IIC_Data(show[i++]);
}
}
}
void picture_1(void)
{
unsigned char x,y;
unsigned int i=0;
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(y=0;y<8;y++)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(x=0;x<128;x++)
{
Write_IIC_Data(show1[i++]);
}
}
}
void picture_2(void)
{
unsigned char x,y;
unsigned int i=0;
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(y=0;y<8;y++)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(x=0;x<128;x++)
{
Write_IIC_Data(show2[i++]);
}
}
}
/***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms) //
{
unsigned int m;
for(;Del_50ms>0;Del_50ms--)
for(m=6245;m>0;m--);
}
void Delay_1ms(unsigned int Del_1ms) //
{
unsigned char j;
while(Del_1ms--)
{
for(j=0;j<123;j++);
}
}
int main(void)
{
jtagWait(); // 防锁死
clockInit(); // 系统时钟设置
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB| SYSCTL_PERIPH_GPIOD); // 使能GPIOB模块
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_2); //D0/SCLK/PB2
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_3);//D1/MOSI/PB3
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6 );//配置PD6为输出
// RES=0;
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,0); //控制RES管脚为低电平
Delay_1ms(20);
// RES=1;
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,~0);//控制RES管脚为高电平
Delay_1ms(20);
Initial_LY096BG30();
Delay_1ms(10);
while(1)
{
// Initial_LY096BG30();
// Delay_1ms(10);
// fill_picture(0xff); Delay_50ms(200);
// fill_picture(0xf0); Delay_50ms(200);
picture(); Delay_50ms(400);
picture_1(); Delay_50ms(400);
picture_2(); Delay_50ms(400);
};
}
我也来说说我的TI经历!
我是从TI的免费样片MSP430F5438开始的,毕竟还是学生,要买各种学习板的经费压力还是很大的。TI的各种MCU及MPU的大名早有耳闻,各大电子论坛都可以看到火热的讨论的帖子及资料。芯片到时手后我用感光法根据TI的例子制作了一块msp430f5438的最小系统,效果还不错,100脚的封装还是很考验焊接技术的,毕竟自己做的板子没有阻焊层。做好后好不错,可以用精致来形容一下,呵呵呵! 板子做好后,让我可以感受一下相对于51的低功耗的强大,我还参考了利尔达的外围模块,做了一些,学习的进程好快,2011的全国电子设计大赛,还用这个小板做了,本科组的B题(那是我才大二),最后在电机的选择上出现失误,没有达到预计的设计效果,那是的我知识还有非常的欠缺,我想性2012的省赛我定能取得好的成绩。
还有就是,TI的技术支持很不错,在学5438时遇到了时钟的问题,在这个社区,提出的问题有专家帮忙解决了,是在不错!2011年申请了3次的样片,这些芯片都很贵,谢谢TI 的样片支持,让我没花什么钱就入门了msp430,在此衷心祝愿TI越做越好!各位工作人员,新年快乐!
这么给力的东西怎么能不跟帖呢
我大小就喜欢各种带有芯片的东西,梦想就是设计出能带有芯片的东西
上了大学以来,用过51单片机,后来受不了那个编译还不能在线仿真~很蛋疼
后来看到网上TI免费提供样片,参加过几次TI MCUday的活动,感觉TI的芯片很智能,软件环境很好,听说最近又出现了图形化的配置界面,为我们这些人提供了莫大的帮助。
首先感谢TI能给我们这些高校的在校生予以帮助
再说说项目吧
今年的暑假时由于需要做了一款方程式赛车的仪表系统,由于要用到无线技术,由于MCU day推广过cc430,这个东西可谓相当强大啊,一片小小的处理器上面集成了无线模块,ADC,GPIO,好多好多外设,经过前端电路的处理,信号过来可以直接被处理,模拟数字都可以处理,太高科技了~哈哈,做好了电路板,焊接上去真是够小巧的了~,一块芯片搞定。
其中的难点肯定是有的啊,比如说这些模块如何快速应用到产品中,我的选择是查询TI给的官方例程,加以修改就可以直接应用。比如说其中ADC的配置,各种时钟的配置,无线收发等等,当然cc430的中断还是相当多的,有些东西我也搞不定。
希望能有个简单点的操作系统支持这样就可以使产品更加功能化,编写应用程序就可以了~
今天先说这些~呵呵
我也说说和TI的缘分@@
刚开始使用MCU都是STC之类的8位芯片,因为是51架构,感觉很顺手,但是总有一些小的问题,让人很困惑,。。。
后来又接触到C8051F系列,感觉很强大,也很好用,所以用了好一段时间,做好几个产品,感觉还不错,但偶尔也能从售后人员那得到现场反反馈信息说,有死机情况,我一直认为是操作问题,也没有经意,直到问题比较多时,我亲自跑了一次现场,并亲自现场测试,才确定确实是产品有问题,分析结果得到肯定,是MCU的POR的闩锁效应,这个让我很困惑,后来专门给使用这种芯片的产品传门做了,电源管理,由于是补救措施,所以。。。很怀惧。。。
自从那次之后,虽然C8051F在我心中有许多美好的,但我还是留下了心理阴影。。
后来,由于用过TI的DSP,TMS320F28335和TMS320C6713所以有些用低功耗的产品,我也用过msp430,但因为贵,所以许多产品上也不敢用,但是由于开发工具和尤其搭配的IAR让我印象很深,。。。
再后来更深结缘是在有一次开发GPRs模块时,有一次把模块的波特率给整的不是整数了,捣鼓了一天,最好才想到用自适应波特率把问题给解决,让我省了很多,(厂家说是要我发回去,上它们的测试平台),哈哈,虽然其它MCU也都有波特率自适应,但还是要谢430,让我感觉很自豪。。。
LM3S8962和cc2530,有线和无线完美结合。
最近做了一个项目,可以称之为物联网项目吧。由一个路由和一个终端组成:路由由一片网络芯片lm3s8962和一片CC2530组成,它们之间的通讯通过串口进行;终端采用CC2530芯片。通过网络->串口->Zigbee无线,zigbee无线->串口->网络的通讯模式实现了完美的远程控制,可以通过手机,电脑在任何地方控制终端设备。在其中碰到很多问题,都得到了TI技术支持团队及时,高效的答复。赞一个!
我最早接触TI的DSP是在2009年,当时在网上购买了一套TMS320F2812的开发板,通过自己学习,掌握了简单的应用,在公司的产品中没有应用是因为当时不具备条件,后来在C2000的Piccolo推出来之后,我就申请到了一套TMS320F28027的套件,拿到套件后很兴奋,跟着代码学习,对使用TMS320F28027控制LED的应用感兴趣,制作了一套控制LED灯的系统,参考controlSUITE中的彩灯控制程序,目前板子已经焊接结束,接下来程序调试,先把板子的PCB贴出来看看,等到实际完成后再把程序分享给大家。
PCB板布线照片:
07年开始接触TI的OMAP,不过公司用的这个芯片是TI已经不推荐使用的了,所以技术支持这块基本上不能指望,遇到问题都得自己处理。今天不说已经解决了的问题,只说几个发现了但解决不了的问题:
1、看门狗功能不能使用的问题:看门狗复位后,程序并不能重新开始运行(问过技术支持,问过TI总部,最后结论是:开发该芯片的团队已经解散多时,没办法了,呵呵)
2、莫名其妙的产生RESERVED INTERRUPT的问题
3、3个UART一起使用,会出现突然有的UART不能再进中断的问题
4、USB的版本号与手册上的不一致,问技术支持也不知道原因
LM3S8962和cc2530,有线和无线完美结合。
最近做了一个项目,可以称之为物联网项目吧。由一个路由和一个终端组成:路由由一片网络芯片lm3s8962和一片CC2530组成,它们之间的通讯通过串口进行;终端采用CC2530芯片。通过网络->串口->Zigbee无线,zigbee无线->串口->网络的通讯模式实现了完美的远程控制,可以通过手机,电脑在任何地方控制终端设备。在其中碰到很多问题,都得到了TI技术支持团队及时,高效的答复。赞一个!
学习就是迎接挑战、解决困难的过程,没有挑战,就没有人生的乐趣。
以MSP430系列单片机的学习过程作为启发,我总结出学习单片机的过程如下,希望与大家共享。
(1)获取资料
购买有关书籍,并到杭州利尔达公司网站和TI网站获取资料,例如,在网上可以找到FET使用指导、MSP430 F1xx系列、F4xx系列的使用说明和具体单片机芯片的数据说明,可以找到仿真器FET的电路图、实验板电路图、芯片封装知识等大量的实际应用参考电路,当然有些资料是英文的,看懂英文资料是个挑战,学会4、6级英语就是为看资料的。英语难学,但是看资料容易,只要下决心,看完一本资料,就可以看懂所有的相关资料。
(2)购买仿真器FET和实验电路板
如果经济条件不错,可以直接购买。
(3)自制仿真器FET和实验电路板
自制仿真器FET,首先要到网上找到FET电路图,然后就可以使用画电路板软件画电路图和电路板图,这又是个挑战。FET电路非常简单,但要把它制作出来还是需要下一番工夫的,找一本有关书,然后练习画原理图,画完原理图后,就学习认识元件封装,再购买元件,这时就可以画电路板图了,一旦画好,将形成的PCB文件交给电路板制作公司,10天后,就可以得到电路板,焊上元件和电缆,等实验电路板做好后,就可以与实验电路板一起调试了。
自制实验电路板,需要单片机芯片内部工作原理的知识、封装知识,清楚的知道每一个引脚的功能,还需要数码管、按钮、排电阻、三端稳压器、二极管、散热器、电解电容、普通电容、电阻、钮子开关等元件的知识,对于初学者,可以做一个只有3个数码管、8个按钮、8个发光二极管的简单实验板,这样的实验板,虽然简单,但足可以帮助初学者入门单片机。自制实验电路板与自制FET一样,首先画电路图,然后买元件,再画电路板。由于MSP430系列芯片是扁平封装,焊接起来有一定难度,这好象是个挑战,但实际上很简单,方法如下:首先在焊盘上涂上松香水,在松香水未干的情况下,将芯片放在焊盘上,注意芯片第一引脚的位置,并使引脚与焊盘对齐,将擦干净的电烙铁(不能有任何焊锡)接触引脚,引脚只要一热,焊盘上的焊锡就自动将引脚焊住了,千万注意电烙铁上不能有焊锡,焊接时最好配备一个放大镜。焊接电路板时,每一个元件都要核对参数,可以用万用表测量的元件一定要测量。
(4)从网上获得IAR软件
到利尔达公司或TI公司的网站下载IAR软件,并安装到计算机上。
(5)调试FET和实验板
将FET的一端与PC机的并行口相连,另一端连接实验板的JTAG接口,上电后,检查FET芯片、实验板上的单片机芯片是否发热(用手模),PC机是否工作正常后,运行IAR软件,找个C语言或汇编语言的例子,编译成功后下载到单片机中,如果能够下载,说明一切成功。否则还需要仔细研究,一般情况下,只要电路板上的电路正确,元件参数准确,没有不成功的。
(6)分步骤学习单片机
学习使用单片机就是理解单片机硬件结构,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。
第一步:数字I/O的使用
使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出功能。每使用单片机的一个功能,就要对控制该功能的寄存器进行设置,这就是单片机编程的特点,千万不要怕麻烦,所有的单片机都是这样。
第二步:定时器的使用
学会定时器的使用,就可以用单片机实现时序电路,时序电路的功能是强大的,在工业、家用电气设备的控制中有很多应用,例如,可以用单片机实现一个具有一个按钮的楼道灯开关,该开关在按钮按下一次后,灯亮3分钟后自动灭,当按钮连续按下两次后,灯常亮不灭,当按钮按下时间超过2s,则灯灭。数字集成电路可以实现时序电路,可编程逻辑器件(PLD)可以实现时序电路,可编程控制器(PLC)也可以实现时序电路,但是只有单片机实现起来最简单,成本最低。
定时器的使用是非常重要的,逻辑加时间控制是单片机使用的基础。
第三步:中断
单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事情,例如,按钮按下时的下降沿。要使单片机在程序正常运行过程中,对快速动作做出反应,就必须使用单片机的中断功能,该功能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行正常的程序。中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断),需要设置哪些寄存器才能使某种中断起作用,中断开始时,程序应该干什么,中断完成后,程序应该干什么等等。
中断学会后,就可以编制更复杂结构的程序,这样的程序可以干着一件事,监视着一件事,一旦监视的事情发生,就中断正在干的事情,处理监视的事情,当然也可以监视多个事情,形象的比喻,中断功能使单片机具有吃着碗里的,看着锅里的功能。
以上三步学会,就相当于降龙十八掌武功,会了三掌了,可以勉强护身。
第四步:与PC机进行RS232通信
单片机都有USART接口,特别是MSP430系列中很多型号,都具有两个USART接口。,USART接口不能直接与PC机的RS232接口连接,它们之间的逻辑电平不同,需要使用一个MAX3232芯片进行电平转换。
USART接口的使用是非常重要的,通过该接口,可以使单片机与PC机之间交换信息,虽然RS232通信并不先进,但是对于接口的学习是非常重要的。正确使用USART接口,需要学习通信协议,PC机的RS232接口编程等等知识。试想,单片机实验板上的数据显示在PC机监视器上,而PC机的键盘信号可以在单片机实验板上得到显示,将是多么有意思的事情啊!
第五步:学会A/D转换
MAP430单片机带有多通道12位A/D转换器,通过这些A/D转换器可以使单片机操作模拟量,显示和检测电压、电流等信号。学习时注意模拟地与数字地、参考电压、采样时间,转换速率,转换误差等概念。
使用A/D转换功能的简单的例子是设计一个电压表。
第六步:学会PCI、I2C接口和液晶显示器接口
这些接口的使用可以使单片机更容易连接外部设备,在扩展单片机功能方面非常重要。
第七步:学会比较、捕捉、PWM功能
这些功能可以使单片机能够控制电机,检测转速信号,实现电机调速器等控制起功能。
如果以上七步都学会,就可以设计一般的应用系统,相当于学会十招降龙十八掌,可以出手攻击了。
第八步:学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计
学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计是非常重要的,因为这是当前产品开发的发展方向。
到此为止,相当于学会15招降龙十八掌,但还不到打遍天下无敌手的境界。即使如此,也算是单片机大虾了。顺便说一句,MSP430单片机的技术支持是非常好的,负责任的工程师大虾会在关键时候,挺身而出,使你化险为夷。
6. 达到理想境界
达到理想境界是困难的,在知识爆炸的年代里,即使天天学习,也很难跟上科学技术的发展,更何况每天还要为找工作、提职称、写论文、搞科研经费、政治学习、买房、购车、柴、米、油、盐、酱、醋、茶等忙活,那么,还需要学习吗?回答是肯定的,人就是为兴趣而活,爱好单片机才能学会单片机,不为什么目的,只为学习的乐趣,当然要是兴趣也能赚钱,则是一举两得。
学会使用单片机其实是学会了使用工具,充其量是个补锅、锔碗的匠人。如果再要进步,就需要在信号识别、控制理论、数字信号处理理论、通信理论等方面下工夫,只有这样,才能开发出高水平、高附加值、具有知识产权的产品,达到熟练运用降龙十八掌,打遍天下无敌手的至高境界。
单片机是DSP、嵌入式操作系统等高级硬件产品开发的基础。如果想要进一步的发展,必须学会单片机的开发。
如果在学会单片机的基础之上,学会CPLD和FPGA的开发以及硬件描述语言,就可以在高速产品的开发方面获得一杯羹。
以上所述,难免错误,请各位大虾指正。谢谢!
一直对电子科技兴趣深厚,大学期间,学的是化学,一个偶然的机会,接触到了电赛,就主动报名了,接下来就在实验室里开始了我的钻研学习生涯,我从msp430入门单片机领域,现在想来,很幸运,得益于msp430清晰架构、便于开发、低功耗以及较低成本,我顺利入门并在一些项目中运用到msp430,虽然现在单片机领域种类繁多,51、AVR、STM、NXP/ARM等,但是msp430仍然是我的首选,到现在为止,我基本上完成了每个模块的学习和运用,对其在实际项目的运用也是得心应手,最近的一个项目是msp430结合cc2500的无线传感器及中控系统,一路虽然经历很多疑难和bug程序的“摧残”,但是,到最终运行OK时,心里充满喜悦,就开发经验而言,我想更多的是要多看技术文档,多调试,通过对照,一点一点发现并解决问题,msp430好样的,加油!
以下是我使用430的MCU积累的一些经验,希望对大家有所帮助:
1、在430单片机选型的时候一定选注意同系列芯片的区别,TI把同系列的芯片使用同一个PDF,不注意会造成方案设计的的误导。最好用TI的选型工具进行比较。以前在定方案的时候选型选择了msp430F2417,后期想增加DAC,看手册2417是有双路DAC,准备写程序在IAR里找不到DAC的寄存器定义,最后咨询TI的FAE才知道2417没有DAC,2617有,幸好俩款硬件相互兼,得以解决。不过也体现出TI的MCU系列的兼容性很强。
2、在调试程序过程中慎重使用指针,如果发现某内存单元的数据无故被改变的时候,很可能是指针溢出引起的问题。在写单片机程序的时候我们可能会遇到三种类型的指针:(1)自己定义的指针(2)数组下标(3)某些起指针作用的SFR。我把指针比作是“既聪明又淘气的孩子”,聪明是因为,很多算法可以很容易用指针实现,淘气是因为一旦程序中指针出问题,非常难以察觉。我曾经写一个程序要用到DMA,在执行到某句代码时,发现有个完全不想管的变量被无故改变,当时想到可能是哪个指针溢出导致的。后来才发现是DMA的source address指针出问题了,此指针应该是递增,我设置成了递减,导致溢出,还有就是尽量避免野指针的使用。
3、430总中断的控制位是状态寄存器内的GIE位(该位在SR寄存器内),该位在复位状态下,所有的可屏蔽中断都不会发生响应。可屏蔽中断又分为单中断源和多中断源的。单中断源的一般响应了中断服务程序中断标志位就自动清零,而多中断源的则要求查询某个寄存器后中断标志位才会清零。由于大多数人接触的第一款单片机通常是51,51单片机CPU在响应低优先级的中断程序过程中若有更高优先级的中断发生,单片机就会去执行高优先级,这个过程已经产生了中断嵌套。而430单片机则不同,如果在响应低优先级中断服务程序的时候,即使来了更高优先级的中断服务请求,430也会置之不理,直至低优先级中断服务程序执行完毕,才会去响应高优先级中断。这是因为430在响应中断程序的时候,总中断GIE是复位状态的,如果要产生类似51的中断嵌套,只能在中断函数内再次置位GIE位。
4、msp430在执行主程序之前默认会对将程序中定义的相关变量初始化为0,但当需要在程序中定义大型数组时,最好在数组前加__no__init,告诉编译器这个数组不需要进行初始化,否则可能因为初始化时间超过WDT而导致不断复位。我曾经在写过一个程序,需要定义两个1024长度 int型全局数组,也就是说总共占用2KB字节RAM,当时用的是msp430f2617,其RAM为8KB,按道理不应该出问题。不过当我把程序下到单片机里是,程序一直运行在main函数之前的一段引导区代码,无法进入到主程序中。在加了__no__init预编译说明后,问题得到解决。
首先先感谢德州仪器公司一贯以来对我们广大客户的大力支持!
一直以来,很欣赏德州仪器的芯片适用机制,每次申请试用,德州仪器都会大力支持;而且还收到了赠送的LM3S8962开发套件,以及在线技术支持社区的小礼品等等。在这个机会里一并感谢工作人员!
以前一直用8位的51单片机,直到试用德州仪器的MSP430之后才感觉到了德州仪器产品的易用和强大。尤其在低功耗方面,优势尤为突出!
公司以前的产品多为定型产品,例如电机转矩转速测量仪,我接触430之后,将其运用到此产品的改进。选择了MSP430F5438。具体实现方法为:1、利用光电开关检测电机轴端安装的开口码盘,将数字脉冲送入单片机中,利用其捕获功能,算出电机当前转速,输出到外围显示;2、利用5N压力传感器检测电机在制动时的压力,将模拟信号送入ADC12模块,经换算得出当前转矩值,并输出到外围显示电路;3、电机制动采用磁粉制动器,磁粉制动器的制动力矩与其自身得到的外部电压近似线性关系,所以采用外部电位器调节实现PWM占空比的调节,从而平滑的改变磁粉制动器的电压,进而观察不同制动力矩下,电机转速的变化,得到矩频特性曲线。4、利用上位机描写矩频特性曲线,此处又利用到了USB串口通信方面的功能。大体经过以上思路后,我制作了电路板,但是试验时,连续死机,然后参照前辈们的例程,优化了程序,改进了线路板的地线分布,最终程序稳定运行!
经过这个项目,我综合运用了430的多项功能模块,感觉到了这款芯片的强大功能,以及资料的丰富性。在这里将这点心得分享给大家。希望以后利用它做出更好的产品,发挥其最大功效!
谢谢
大家对于TI M3的硬件SSI的SPI模块没,可能会遇到各种毛病,最主要的就是接受SPI数据时没得时钟,但是可以用写无效数据获得SPI读数据一样的效果,发个硬件SPI读SD卡的例子:// 作者:我自己
// 时间:2011-12-28
// 地点:成都信息工程大学
// 注释:参考源程序来源网络,是一个AVR单片机的硬件SPI读写SD卡的程序
// 当前版本,MCU芯片 TI LM3S1138 使用硬件SPI1与SD卡通信,硬件SPI速度最高12M
// 稳定运行(主频50M),可以联系作者邮箱1013846180@qq.com
#include "sd.h"
//----------------------- SD卡驱动-------------------//
//----------------------- 变量定义 -------------------//
//----------------------- API函数 -------------------//
void SD_SPI_Init(void)
{
SPI_Speed_Set(1000000);//初始化使用低速SPI
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);// SD_CS
GPIO(PB, 1<<1, 1);//SD_CS
PB_1 = 0xff; // 关闭SD卡片选
GPIO(PB, 1<<0, 1);//Touch_CS
PB_0 = 0xff; // 关闭触摸片选
}
void SPI_Speed_Set(unsigned long ulBitRate)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOE); // 使能SSI模块所在的GPIO端口
SysCtlPeriEnable(SYSCTL_PERIPH_SSI1); // 使能SSI模块
GPIOPinTypeSSI(GPIO_PORTE_BASE , GPIO_PIN_0 | // 将相关GPIO设置为SSI功能
GPIO_PIN_2 |
GPIO_PIN_3);
SSIConfig(SSI1_BASE , // 配置SSI模块
SSI_FRF_MOTO_MODE_0 , // Freescale格式,模式0
SSI_MODE_MASTER , // 主模式
ulBitRate , // 设置位速率
8); // 设置数据宽度
SSIEnable(SSI1_BASE); // 使能SSI收发
}
// 完成一次通讯,细细体会此函数
unsigned char SD_SPI_Write(unsigned char value)
{
unsigned long temp=0;
SSIDataPut(SSI1_BASE, value);
SSIDataGet(SSI1_BASE, &temp);
return temp;
}
// 向SD卡写命令,cmd是命令字,arg是首地址
// 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
unsigned char SD_Write_Command(unsigned char cmd, unsigned long arg)
{
unsigned char temp=0;
unsigned long retry=0;
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_CS = 0x00;
SD_SPI_Write(cmd | 0x40);
SD_SPI_Write(arg>>24);
SD_SPI_Write(arg>>16);
SD_SPI_Write(arg>>8);
SD_SPI_Write(arg);
SD_SPI_Write(0x95);
while ( (temp = SD_SPI_Write(0xff)) == 0xff )
if (retry++ > TRY_TIME)
break;
SD_CS = 0xff;
return temp;
}
// 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
// 功能描述:初始化SD卡,使用CMD1
// 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR INIT_CMD1_ERROR
// (sd.h中有定义)
unsigned char SD_Reset(void)
{
unsigned char temp=0, i=0;
unsigned long retry=0;
do
{
// 初始时,首先要发送最少74个时钟信号,这是必须的!!!
for(i=0; i<100; i++)
{
SD_SPI_Write(0xff);
}
temp = SD_Write_Command(0, 0); // 写入CMD0
retry++;
if(retry > TRY_TIME)
{
return (INIT_CMD0_ERROR); // CMD0写入失败
}
}while( temp != 0x01 );
retry = 0;
do
{
temp = SD_Write_Command(1, 0);
retry++;
if(retry > TRY_TIME)
{
return (INIT_CMD1_ERROR); // CMD1写入失败
}
}
while(temp != 0);
SPI_Speed_Set(8000000);// 此处设置SPI高速最高12000000
temp = SD_Write_Command(59, 0);// 关crc
temp = SD_Write_Command(16, 512);// 设扇区大小512
return 0; // 返回0,说明复位操作成功
}
// 读的是一整个扇区,
unsigned char SD_Read_Sector(unsigned long sector,unsigned char *buffer)
{
unsigned long j;
unsigned char temp=0;
unsigned long retry=0;
sector += 137;// 我自己的SD实际上有的偏移,MMC好像没得
do
{
temp = SD_Write_Command(17, sector<<9); // 写入CMD17
retry++;
if(retry > TRY_TIME)
{
return (READ_BLOCK_ERROR); // CMD17(读块)失败
}
}while(temp != 0);
//一直读,当读到0xfe时,说明后面的是512字节的数据了,会存在死循环,优化如下:
//while (SD_SPI_Write(0xff) != 0xfe);
SD_CS = 0x00;
retry=0;
while ( SD_SPI_Write(0xff) != 0xfe )
{
retry++;
if (retry > TRY_TIME)
{
SD_CS = 0xff;
return (READ_BLOCK_ERROR);
}
}
for(j=0; j<512; j++) // 将数据读入到数据缓冲区中
{
buffer[j] = SD_SPI_Write(0xff);
}
SD_SPI_Write(0xff);
SD_SPI_Write(0xff); // 读取两个字节的CRC校验码,不用关心它们的值
SD_CS = 0xff; // SD卡关闭片选
return 0;
}
// 功能描述:将buffer指向的512个字节的数据写入到SD卡的sector扇区中
// 参数说明:sector:扇区地址
// buffer:指向数据缓冲区的指针
// 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
// 向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令)
unsigned char SD_Write_Sector(unsigned long sector, unsigned char *buffer)
{
unsigned char temp;
unsigned long retry=0;
unsigned long i;
sector += 137;
do
{
temp = SD_Write_Command(24, sector<<9);
retry++;
if(retry > TRY_TIME)
{
return (temp); // 命令写入失败
}
}while(temp != 0);
SD_CS = 0x00;
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xff);
SD_SPI_Write(0xfe); // 写入开始字节 0xfe,后面就是要写入的512个字节的数据
for (i=0; i<512; i++) // 将缓冲区中要写入的512个字节写入SD卡
{
SD_SPI_Write( *buffer++ );
}
SD_SPI_Write(0xff);
SD_SPI_Write(0xff); // 两个字节的CRC校验码,不用关心
temp = SD_SPI_Write(0xff); // 读取返回值
if( (temp & 0x1F) !=0x05 ) // 如果返回值是 XXX00DELAY_TIME1 说明数据已经被SD卡接受了
{
SD_CS = 0xff;
return (WRITE_BLOCK_ERROR); // 写块数据失败
}
// 等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)
// 忙时,读回来的值为0x00,不忙时,为0xff
while( !SD_SPI_Write(0xff) );
SD_CS = 0xff; // 关闭片选
return(0); // 返回0,说明写扇区操作成功
}
这个程序仔细看看就晓得(精妙处)了,其他的话就是M3功耗不小啊,