【原创】ZigBee学习之1——SPI&LCD - 小组 - EDN China
【原创】ZigBee学习之2——SPI&LCD - 小组 - EDN China
ZigBee学习之3——USART之UART - longhaihai's Blog -EDNChi...
【原创】ZigBee学习之4——DMA - longhaihai's Blog -EDNChina...
【原创】ZigBee学习之6——无线电2 -小组-EDNChina |
【原创】ZigBee学习之7——OSAL(操作系统抽象层)API解读 - longha...
【原创】ZigBee学习之8——对ZigBee地址的理解 - longhaihai's Bl...
【原创】ZigBee学习之9——Z-Stack编译选项.rtf - longhaihai's B...
ZigBee学习之10——MAC层API解读_百度文库
【原创】ZigBee学习之11——MAC层API解读2 - longhaihai's Blog -...
【原创】ZigBee学习之12——对ZDO的初步理解 - longhaihai's Blog... |
【原创】ZigBee学习之13——ZStack API解读 - longhaihai's Blog ...
【原创】ZigBee学习之14——ZStack API解读2 - longhaihai's Blog...
【原创】ZigBee学习之15——ZStack API解读3 - longhaihai's Blog...
ZigBee学习之16——ZStack API解读4_百度文库
【原创】ZigBee学习之17——ZStack API解读5 - longhaihai's Blog...
【原创】ZigBee学习之18——ZCL解读 - longhaihai's Blog -EDN C...
【原创】ZigBee学习之19——如何创建自己的简单应用 - longhaihai...
【原创】ZigBee学习之20——SimpleAPP分析 - longhaihai's Blog -...
ZigBee学习之22—— HAL_BOARD_INIT()_百度文库
【原创】ZigBee学习之23—— zmain_vdd_check() - longhaihai's B...
【原创】ZigBee学习之24——zmain_ram_init() -小组 -EDN China
【原创】ZigBee学习之25——InitBoard -小组 -EDN China
ZigBee学习之26——HalDriverInit()_百度文库
【原创】ZigBee学习之27——osal_nv_init - longhaihai's Blog - ...
ZigBee学习之28——zgInit() - longhaihai's Blog -EDN ...
...ZigBee学习之29——ZMacInit() - longhaihai's Blog -EDN Chi...
【原创】ZigBee学习之30——afInit() - longhaihai's Blog -EDN ...
【原创】ZigBee学习之31——osal_init_system - longhaihai's Blo...
【原创】ZigBee学习之32—— zmain_dev_info() -小组 -EDN China |
【原创】ZigBee学习之33——osal_start_system() - longhaihai's ...
...ZigBee学习之35——按键部分及系统调用时钟的分析2 -小组 - E...
【原创】ZigBee学习之36——simpleapp分析-续 - longhaihai's Blo...
【原创】ZigBee学习之37——osalInitTasks()分析 - longhaihai's ... |
【原创】ZigBee学习之38——初步理解Home Automation Profile - ... |
【原创】ZigBee学习之39——Home Automation Profile2 - longhaih...
【原创】ZigBee学习之40——Home Automation Profile3 - longhaih...
【原创】ZigBee学习之41——SimpleSwitch - longhaihai's Blog - ...
【原创】ZigBee学习之42——协议栈中的串口操作 - longhaihai's B...
ZigBee学习之
学习之1——点灯
点灯点灯
点灯
我用的编译环境是IARfor51 7.30B,再介绍一下我的开发板的情况,ZigBee模块用的是CC2430.这块芯片是一款Soc
的芯片,集成了8051内核和ZigBee射频部分,只要很少的外部电路就可以搭建一个射频模块。因为其中的是8051的
内核,所有对于熟悉8051系列的同学们来说,基本的一些操作就很简单了,这里我们在温习一下,顺便对CC2430芯片
进行一下熟悉。嵌入式的一大特点是其底层的软件和硬件紧密相关,如果没有数字电路的知识,那么作起来是很困难的。
我们先介绍一下基本的管脚分配情况:P0的2和3接到了一个232电压转换芯片上,可以用来和PC进行通信,
LCD_RST,LCD_CS,接的是LCD的复位和片选端,这里我用到的LCD是兼容PCD8544的NOkia5110的LCD,为SPI
总线LCD,84X48点阵。CC2430_MOSI,CC2430_CLK都接到LCD上了。P1_0接到一个调试LED上面,为高电平点亮。
下面的第一个实验就很简单了,我们只要把P1_0配置为通用IO,输出方式,然后从这里输出高电平,那么就可以点亮
这个LED了。用到的寄存器为:
P1配置寄存器P1SEL,
P1方向寄存器P1DIR
程序如下:
#include<ioCC2430.h>
#define DEBUG_LED P1_0
void delay(unsigned int n){
//26 cycles delay
while(--n)asm("NOP");
}
void LEDInit(){
P1SEL &= 0XFE; //P1_0 defined General purpose I/O
P1DIR |= 0X01; //P1_0 defined Output
}
main(){
LEDInit();
while(1){
DEBUG_LED = 1; //Led light
delay(50000);
DEBUG_LED = 0;
delay(50000);
}
}
编译通过以后就用TI的官方工具SmartRF Flash Programmer将生成的HEX文件,烧录到CC2430吧,激动的时刻,呵
呵如果点亮了这个小小的LED那么恭喜你,你的硬件因该是没有问的了,一个小小的胜利后我们就有更多的勇气和信
心前进咯! ZigBee学习之
学习之学习之
学习之2——SPI&LCD 今天的任务是用SPI总线方式点亮LCD屏幕,呵呵这里要涉及到两个内容,一个是SPI总线,一个LCD。
CC2430的话已经集成了SPI总线,只要将IO口配置为外设,然后将USART配置成SPI方式就可以了。
关于LCD其实也很简单,很多没有接触过的同学可能将其想象的太过复杂了,就是将字或者图像转换为一个一个的点,
如果要这点显示东西呢,就把这点点亮,否则则不点亮。其实PCD8544已经将很多细节的东西做好了,我们要做的呢,
就是发送一串命令序列,然后发送要显示的数据就可以了。看看PCD8544的芯片资料,我们还会发现在最后它竟然给
出了操作实例,呵呵相信大家都能看懂的吧,如果有看不懂的可以给我留言或者是QQ联系我哦,我如果知道的话一定
给大家详细的答复!
CC2430的SPI的是放在USART外设里面的,和UART放在一起,同一个USART即可以配置成UART也可以配置成
SPI,SPI的主从模式通过相关的寄存器来选择。关于管脚的分配也不难,这里就不多说了,其实这里还算是8051的基
础实验,对于8051很熟悉的同学肯定觉得我是在说废话了,哈哈!
这里只提一下关于SPI应该注意的一点问题:
1、PCD8544 的SPI是高电平采样,所以,主机端必须是高电平之前要把数据准备好。所以主机端的发送(MOSI)因该
设为下降沿采样。
当用SPI和PCD8544通信时,速率不能太低,否则点不亮LCD,或者是出来乱码
下面是引用网友的SPI总线心得,我觉得看看很有益处:
SPI接口时钟配置心得:
在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,
因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要
搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。
但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,
从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,
所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,
跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,
充分说明了时钟极性是如何配置的:
The 81xx module will always input data bits at the rising edge of the clock,
and the host will always output data bits on the falling edge of the clock.
意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。
因此主设备这边SPI时钟极性应该配置为下降沿有效。
又如,下面这段话是摘自LCD Driver IC SSD1289:
SDI is shifted into 8-bit shift register on every rising edge of SCK in the order
of data bit 7, data bit 6 …… data bit 0.
意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。
因此主设备的SPI时钟极性同样应该配置为下降沿有效。
时钟极性和相位配置正确后,数据才能够被准确的发送和接收。
因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。 老规矩,上程序:
先来一个不用SPI方式控制LCD显示的实例:
#include "periodef.h"
#include <string.h>
void delay(uint n){
//26 cycles delay
while(--n)asm("NOP");
}
void LCD_IOInit(){
P0SEL &=~ 0X03;
P0DIR |= 0X03;
P1SEL &=~ 0XF0;
P1DIR |= 0XF0;
}
void LCD_WriteOneByte(uchar data){
uchar i = 0;
for(i=0;i<8;i++){
LCD_SCK = 0;
if((data<<i)&0x80){
LCD_SIN = 1;
}
else{LCD_SIN = 0;}
LCD_SCK = 1;
}
}
void LCD_WriteMByte(uchar *data,uint num){
while(num--){
LCD_WriteOneByte(*data);
data++;
}
}
void LCD_Init(){
LCD_nCS = 0;
delay(100);
LCD_nRES = 0;
delay(100);
LCD_nRES = 1;
delay(100); LCD_DnC = 0;
LCD_WriteOneByte(0x21);
LCD_WriteOneByte(0xC8);
LCD_WriteOneByte(0x06);
LCD_WriteOneByte(0x13);
LCD_WriteOneByte(0x20);
LCD_WriteOneByte(0x0C);
LCD_DnC = 1;
}
main(){
uint i = 0;
uchar Hello[]={
0x00,0x7E,0x10,0x10,0x7E,0x00,/*"H",0*/
/* (6 X 8 , 楷体_GB2312 )*/
0x00,0x7E,0x52,0x52,0x42,0x00,/*"E",1*/
/* (6 X 8 , 楷体_GB2312 )*/
0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",2*/
/* (6 X 8 , 楷体_GB2312 )*/
0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",3*/
/* (6 X 8 , 楷体_GB2312 )*/
0x00,0x3C,0x42,0x42,0x3C,0x00,/*"O",4*/
/* (6 X 8 , 楷体_GB2312 )*/};
LCD_IOInit();
LCD_Init();
//for(i=0;i<30;i++){
//LCD_WriteOneByte(Hello[i]);
//}
LCD_WriteMByte(Hello,30);
LCD_nCS = 1;
}
下面是采用SPI总线方式控制LCD显示的例子:
//========================
//This file is applicable to Eshine EXBEE-DK V1
//Function:LCD test,the LCD use SPI BUS.The SPI BUS occupation P1-USART1-ALT.2
//InPut :
//OutPut :
//Created :longfan,2010.1.10
//Modify :
//========================
#include "periodef.h"
#include "font.h"
#include "TestBMP.h"
#include <string.h> void delay(uint n){
//26 cycles delay
while(--n)asm("NOP");
}
void LEDInit(){
P1SEL &= 0XFE; //P1_0 defined General purpose I/O
P1DIR |= 0X01; //P1_0 defined Output
DEBUG_LED = 1; //LED light up
}
//========================
//Initial P1-USART1-SPI
void SPIInit_U1_P1(void){
PERCFG |= 0X02; //USART1.alt.2,P1
P1SEL |= 0XE0; //P1,ISP,P1_4(LCD_DnC) defined general IO
P2SEL |= 0X40; //USART1 has priority
U1GCR |= 0x20; //MSB first,Negative clock polarity,Data is output on MOSI on the falling edge of CLK
U1GCR |= 19; //MAX Baud rate(17),falling edge
U1BAUD = 0;
UTX1IF = 0; //Clear interrupt
}
//========================
//P1-USART1-SPI Send One Byte
void SPI_SendOne_U1_P1(uchar data){
U1DBUF = data;
while(!UTX1IF);
UTX1IF = 0;
}
//========================
//P1-USART1-SPI Send Multily Byte
void SPI_Send_U1_P1(uchar *data,uint length){
while(length){
SPI_SendOne_U1_P1(*data);
data++;
length -= 1;
}
}
//========================
//LCD Use SPI BUS,Set the first display piex.
//When after call this function can direct call SPI data output function
//0<X<83,0<Y<5
void SPI_LCDSetPos(uchar X,uchar Y){
LCD_DnC = 0;
SPI_SendOne_U1_P1(0x80 | X); SPI_SendOne_U1_P1(0x40 | Y);
LCD_DnC = 1;
}
//========================
//LCD Use SPI BUS,Clear the LCD Display and its RAM.
void SPI_ClearLCD(){
uint i;
SPI_LCDSetPos(0,0);
for (i=0; i<504; i++){
SPI_SendOne_U1_P1(0);
}
}
//========================
//LCD Use SPI BUS,Send one LCD Command
void SPI_LCDWriteOneComm(uchar command){
LCD_DnC = 0;
SPI_SendOne_U1_P1(command);
}
//========================
//LCD Use SPI BUS,Send More than one LCD Command
void SPI_LCDWriteMulComm(uchar *command,uchar num){
LCD_DnC = 0;
SPI_Send_U1_P1(command,num);
}
//========================
//LCD Use SPI BUS,Send More than one data
void SPI_LCDWriteData(uchar *data,uchar length){
LCD_DnC = 1;
SPI_Send_U1_P1(data,length);
}
//========================
//LCD Use SPI BUS,Display a english character Without set position,The inverse argument control
//the inverse video mode.When use font library call this function to display.
//InPut :character:The character want to display
// inverse :Inverse video mode(1) or not(0)
//OutPut :
//Created :longfan,2010.1.10
//Modify :
//========================
void SPI_LCDWriteChar(uchar character,uchar inverse){
uchar line;
LCD_DnC = 1;
if(inverse){
for(line=0;line<6;line++){ SPI_SendOne_U1_P1(~font6x8[character-32][line]);
}
}else{
SPI_Send_U1_P1((uchar *)font6x8[character-32],6);
}
}
//========================
//LCD Use SPI BUS,Display a english character at (X,Y),The inverse argument control
//the inverse video mode.When use font library call this function to display.
//InPut :character:The character want to display
// X,Y :The position want to display
// inverse :Inverse video mode(1) or not(0)
//OutPut :
//Created :longfan,2010.1.10
标签: ctc传感器ac292