02 TI CC2530的uart控制器( 二 )


配置完成后,就可以传输数据了:
发送数据时,通过寄存器把要发送的一个字节数据提交给uart控制器,控制器再把数据通过控制IO口电平来发出.
void putchar(int ch){U0CSR &= ~(0xf<<1); //清除包含发送的4种状态U0DBUF = ch; //把要发出的一字节数据存放到U0DBUF寄存器while (!(U0CSR & (1<<1)))//等到控制器获取到U0DUBF寄存器里的数据为止; if ('\n' == ch)//如是发出的是换行号,还需要发出"\r"回到行首putchar('\r');}
接收数据时, 通过判断控制器的状态确定是否已接收到数据,确认接收到后,则读寄存器,把数据从控制器里取出.
int getchar(){int ch;while (!(U0CSR & (1<<2))) //等到控制器接收到数据;ch = U0DBUF; //读出数据//U0CSR &= ~(1<<2); //清除状态#if 0//在连接在linux系统上,是不会接收到"\n"符号的,只能接收到"\r". window上可以接收到"\n"if ('\r' == ch)ch = '\n';#endif//putchar(ch); //如需要回显,可以去掉备注return ch;}
///
通过uart接口发送命令控制蜂鸣器响的例子完整代码:
【02 TI CC2530的uart控制器】#include void putchar(int ch);void puts(char *line);int uart_init(void);void delay(int val);int getchar();int gets(char *line);int strcmp(char *s1, char *s2);void main(void){char chs[200];// buzzer p0_7active_lowP0SEL &= ~(1<<7);P0DIR |= 1<<7;//P0 &= ~(1<<7);uart_init();while (1){gets(chs);puts("got:");puts(chs);putchar('\n');if (0 == strcmp("bp_on", chs)){P0 &= ~(1<<7); // buzzer active;}if (0 == strcmp("bp_off", chs)){P0 |= (1<<7); // buzzer off;}}}int strcmp(char *s1, char *s2){while ((*s1) && (*s2)){if ((*s1++) != (*s2++))break;}return *s1 - *s2;}int gets(char *line){int ch, i = 0;char *p = line;while (1){ch = getchar();if ('\n' == ch)break;*p++ = ch;}*p = 0;puts("kk:");puts(line);putchar('\n');return p - line;}int getchar(){int ch;while (!(U0CSR & (1<<2))) //等到控制器接收到数据;ch = U0DBUF; //读出数据//U0CSR &= ~(1<<2); //清除状态#if 0//在连接在linux系统上,是不会接收到"\n"符号的,只能接收到"\r". window上可以接收到"\n"if ('\r' == ch)ch = '\n';#endif//putchar(ch); //如需要回显,可以去掉备注return ch;}int uart_init(void){//从16Mhz时钟改成32M时钟CLKCONCMD &= ~(1<<6); //32Mhz sourcewhile (CLKCONSTA & (1<<6));CLKCONCMD &= ~7; //32Mhz// P0_2(RX)P0_3(TX)//P0_2, P0_3设置为uart控制器来控制, 不是作通用的IOP0SEL |= (1<<2)|(1<<3);//uart0的tx,rx口可以选择 P0_2,P0_3 也可以选择 P1_4, P1_5//通过寄存器PERCFG来确定使用哪两个IO口 PERCFG &= ~1; //选择P0_2, P0_3作uart的rx,tx脚 U0CSR = (1<<7)|(1<<6); // usart0 作uart控制器,不作spi控制器用U0UCR = 0; // 8N1// U0GCR 是关于spi控制器的配置,这里作uart控制器,所以不用配// U0DBUF 用于把数据交给uart控制器发出,并把控制器接收到的数据取回//波特率设置 表P151// 115200BAND_M(216)BAND_E(11)U0GCR = 11; //最低5位用于存放uart的波特率设置 的BAND_EU0BAUD = 216;//return 0;}void putchar(int ch){U0CSR &= ~(0xf<<1); //清除包含发送的4种状态U0DBUF = ch; //把要发出的一字节数据存放到U0DBUF寄存器while (!(U0CSR & (1<<1)))//等到控制器获取到U0DUBF寄存器里的数据为止; if ('\n' == ch)//如是发出的是换行号,还需要发出"\r"回到行首putchar('\r');}void puts(char *line){while (*line)putchar(*line++);}void delay(int val){int i, j;for (i = 0; i < val; i++){for (j = 0; j < 533; j++);}}