亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>主機(jī)配件>內(nèi)存>

cc2530串口通信

2017年11月08日 14:37 網(wǎng)絡(luò)整理 作者: 用戶評(píng)論(0

  編寫程序?qū)崿F(xiàn)實(shí)驗(yàn)板定期向PC機(jī)串口發(fā)送字符串“Hello ! I am CC2530 。\n”。實(shí)驗(yàn)板開機(jī)后按照設(shè)定的時(shí)間間隔,不斷地向PC及發(fā)送字符串,報(bào)告自己的狀態(tài),每發(fā)送一次字符串消息,LED1閃亮一次。具體工作方式如下:

 ?、?通電后LED1熄滅。

  ② 設(shè)置USART 0使用位置。

 ?、?設(shè)置UART工作方式和波特率。

 ?、?LED1點(diǎn)亮。

 ?、?發(fā)送字符串“Hello ! I am CC2530。\n”。

 ?、?LED1熄滅。

 ?、?延時(shí)一段時(shí)間,延時(shí)時(shí)間可以設(shè)置為3秒。

 ?、?返回步驟④循環(huán)執(zhí)行。

  串口通信介紹

  數(shù)據(jù)通信時(shí),根據(jù)CPU與外設(shè)之間的連線結(jié)構(gòu)和數(shù)據(jù)傳送方式的不同,可以將通信方式分為兩種:并行通信和串行通信。

  并行通信是指數(shù)據(jù)的各位同時(shí)發(fā)送或接收,每個(gè)數(shù)據(jù)位使用單獨(dú)的一條導(dǎo)線,有多少位數(shù)據(jù)需要傳送就需要有多少條數(shù)據(jù)線。并行通信的特點(diǎn)是各位數(shù)據(jù)同時(shí)傳送,傳送速度快效率高,并行數(shù)據(jù)傳送需要較多的數(shù)據(jù)線,因此傳送成本高,干擾大,可靠性較差,一般適用于短距離數(shù)據(jù)通信,多用于計(jì)算機(jī)內(nèi)部的數(shù)據(jù)傳送方式。

  串行通信是指數(shù)據(jù)一位接一位順序發(fā)送或接收。串行通信的特點(diǎn)是數(shù)據(jù)按位順序進(jìn)行,最少只需一根數(shù)據(jù)傳輸線即可完成,傳輸成本低傳送數(shù)據(jù)速度慢,一般用于較長距離的數(shù)據(jù)傳送。

  串行通信又分同步和異步兩種方式。

 ?。?)串行同步通信

  同步通信中,所有設(shè)備使用同一個(gè)時(shí)鐘,以數(shù)據(jù)塊為單位傳送數(shù)據(jù),每個(gè)數(shù)據(jù)塊包括同步字符、數(shù)據(jù)塊和校驗(yàn)字符。同步字符位于數(shù)據(jù)塊的開頭,用于確認(rèn)數(shù)據(jù)字符的開始;接收時(shí),接收設(shè)備連續(xù)不斷地對傳輸線采樣,并把接收到的字符與雙方約定的同步字符進(jìn)行比較,只有比較成功后才會(huì)把后面接收到的字符加以存儲(chǔ)

  同步通信的優(yōu)點(diǎn)是數(shù)據(jù)傳輸速率高,缺點(diǎn)是要求發(fā)送時(shí)鐘和接收時(shí)鐘保持嚴(yán)格同步。在數(shù)據(jù)傳送開始時(shí)先用同步字符來指示,同時(shí)傳送時(shí)鐘信號(hào)來實(shí)現(xiàn)發(fā)送端和接收端同步,即檢測到規(guī)定的同步字符后,接著就連續(xù)按順序傳送數(shù)據(jù)。這種傳送方式對硬件結(jié)構(gòu)要求較高。

 ?。?)串行異步通信

  異步通信中,每個(gè)設(shè)備都有自己的時(shí)鐘信號(hào),通信中雙方的時(shí)鐘頻率保持一致。異步通信以字符為單位進(jìn)行數(shù)據(jù)傳送,每一個(gè)字符均按照固定的格式傳送,又被稱為幀,即異步串行通信一次傳送一個(gè)幀。

  每一幀數(shù)據(jù)由起始位(低電平)、數(shù)據(jù)位、奇偶校驗(yàn)位(可選)、停止位(高電平)組成。幀的格式如圖5-1所示:

  cc2530串口通信

  起始位:發(fā)送端通過發(fā)送起始位而開始一幀數(shù)據(jù)的傳送。起始位使數(shù)據(jù)線處于邏輯0,用來表示一幀數(shù)據(jù)的開始。

  數(shù)據(jù)位:起始位之后就開始傳送數(shù)據(jù)位。在數(shù)據(jù)位中,低位在前,高位在后。數(shù)據(jù)的位數(shù)可以是5、6、7或者8。

  奇偶校驗(yàn)位:是可選項(xiàng),雙方根據(jù)約定用來對傳送數(shù)據(jù)的正確性進(jìn)行檢查??蛇x用奇校驗(yàn)、偶校驗(yàn)和無校驗(yàn)位。

  停止位:在奇偶檢驗(yàn)位之后,停止位使數(shù)據(jù)線處于邏輯1,用以標(biāo)志一個(gè)數(shù)據(jù)幀的結(jié)束。停止位邏輯值1的保持時(shí)間可以是1、1.5或2位,通信雙方根據(jù)需要確定。

  空閑位:在一幀數(shù)據(jù)的停止位之后,線路處于空閑狀態(tài),可以是很多位,線路上對應(yīng)的邏輯值是1,表示一幀數(shù)據(jù)結(jié)束,下一幀數(shù)據(jù)還沒有到來。

  2.CC2530的串口通信模塊

  CC2530有兩個(gè)串行通信接口USART 0和USART 1,它們能夠分別運(yùn)行于異步UART模式或者同步SPI模式。兩個(gè)USART具有同樣的功能,可以設(shè)置在單獨(dú)的I/O引腳,如表5-1所示

  cc2530串口通信

  根據(jù)映射表可知,在UART模式中,使用雙線連接方式,UART 0和UART 1對應(yīng)的外部設(shè)置I/O引腳關(guān)系分別為:

  位置1:RX0----P0_2 TX0----P0_3 P0_5----RX1 TX1----P0_4

  位置2:RX0----P1_4 TX0----P1_5 P1_7----RX1 TX1----P1_6

  UART模式的操作具有下列特點(diǎn):

  ? 8位或者9位有效數(shù)據(jù)

  ? 奇校驗(yàn)、偶校驗(yàn)或者無奇偶校驗(yàn)

  ? 配置起始位和停止位電平

  配置LSB或者M(jìn)SB首先傳送

  ? 獨(dú)立收發(fā)中斷

  ? 獨(dú)立收發(fā)DMA觸發(fā)

  ? 奇偶校驗(yàn)和數(shù)據(jù)幀錯(cuò)誤狀態(tài)指示

  UART模式提供全雙工傳送,接收器中的位同步不影響發(fā)送功能。傳送一個(gè)UART字節(jié)包含1個(gè)起始位、8個(gè)數(shù)據(jù)位、1個(gè)作為可選項(xiàng)的第9位數(shù)據(jù)或者奇偶校驗(yàn)位再加上1個(gè)或2個(gè)停止位。實(shí)際發(fā)送的幀包含8位或者9位,但是數(shù)據(jù)傳送只涉及一個(gè)字節(jié)。

  1234567891011121314

  3.CC2530串口通信的相關(guān)寄存器

  對于CC2530的每個(gè)USART串口通信,有5個(gè)如下的寄存器(x是USART的編號(hào),為0或者1):

  ? UxCSR:USARTx控制和狀態(tài)寄存器

  ? UxUCR:USARTx UART控制寄存器

  ? UxGCR:USARTx 通用控制寄存器

  ? UxBUF:USART x接收/發(fā)送數(shù)據(jù)緩沖寄存器

  ? UxBAUD:USART x波特率控制寄存器

  1234567

  4.串口0初始化

  串口0 初始化

  PERCFG=0X00; //外設(shè)控制寄存器 這里使用串口0位置1

  P0SEL=0X0C; //0_2 0_3設(shè)置特殊端口

  U0CSR |=0X80;//0100 0000 0x80 串口通信的語言這里使用USART

  U0BAUD =216 ;

  U0GCR=10 ; //波特率

  U0UCR |=0x80; //流控制禁止

  U0CSR |=0x40; //允許接受數(shù)據(jù)

  UTX0IF = 0; //接受標(biāo)志位

  URX0IF = 0; //發(fā)送標(biāo)志位

  URX0IE=1; //使能中斷

  EA=1; //中斷總開關(guān)

  串口設(shè)置

  TX 發(fā)送數(shù)據(jù)

  RX 接收數(shù)據(jù)

  123456789101112131415161718192021

  cc2530串口通信

  波特率設(shè)置

  12

  cc2530串口通信

  U0CSR和U0BAUD用來設(shè)置波特率

  例如設(shè)置波特率位57600:

  U0BAUD = 216;

  U0GCR = 10;

  12345

  具體初始化

  UART0初始化配置

  1、設(shè)置USARTX0 為備用位置1,一般采用上電默認(rèn),無需配置

  PERCFG &= ~0X01;

  2、設(shè)置P0用作串口,P0_2、P0_3作為片上外設(shè)I/0

  P0SEL |= 0X0C;

  3、設(shè)置P0口外設(shè)優(yōu)先級(jí),采用上電默認(rèn)值(P2DIR),無需配置

  4、設(shè)置UART0波特率

  U0BAUD = 59;

  U0GCR = 10;

  5、USART 模式選擇,UART 模式,允許接收

  U0CSR |= 0XC0;

  6、進(jìn)行USART 清除,并設(shè)置數(shù)據(jù)格式為默認(rèn)值

  U0UCR |= 0X80;

  7、清零UART0 RX 和 UART0 TX 中斷標(biāo)志

  URX0IF = 0;

  UTX0IF = 0;

  8、使能UART0 RX 中斷

  URX0IE = 1;

  9、使能全局中斷

  EA = 1;

  123456789101112131415161718192021

  如果接收到了串口發(fā)來的數(shù)據(jù)URX0IF置1;

  如果發(fā)送成功UTX0IF置1;

  串口收發(fā)配置

  1、串口初始化配置

  2、發(fā)送函數(shù)

  void SendString(char *p) //發(fā)送字符串

  {

  while(1)

  {

  if(*p == ‘\0’)

  break;

  U0DBUF = *p++;

  while(!UTX0IF);

  UTX0IF = 0;

  }

  }

  12345678910111213141516

  3、串口接收中斷服務(wù)函數(shù)

  #pragma vector = URX0_VECTOR

  __interrupt void URX0_f()

  {

  URX0IF = 0;

  buff[i] = U0DBUF;

  if(buff[i] == ‘#’)

  {

  TXstring(buff);

  i = 0;

  }

  else

  i++;

  }

  123456789101112131415

  4、main函數(shù)及時(shí)鐘源的配置

  void main()

  {

  CLKCONCMD &= ~0X47;

  initUART0();

  while(1);

  }

  U0CSR

  USART模式選擇

  開啟/關(guān)閉 接收數(shù)據(jù)功能,在發(fā)送數(shù)據(jù)的時(shí)候需要關(guān)閉接收數(shù)據(jù)功能

  U0CSR |= 0X40; / U0CSR &= ~0X40;

  123456789101112

  cc2530串口通信

  U0UCR

  一般采用上電默認(rèn)值

  U0UCR |= 0X80;

  1234

  cc2530串口通信

  URX0IF

  清空UART0、UART1的RX 中斷標(biāo)志

  URX0IF = 0;

  1234

  cc2530串口通信

  UTX0IF

  12

  cc2530串口通信

  U0CSR

  一般設(shè)置:

  U0CSR |= 0X40; //允許接收

  1234

  cc2530串口通信

  URX0IE

  IEN0 的第二位,使能UART0 RX 中斷

  123

  cc2530串口通信

  P2DIR

  端口0外設(shè)優(yōu)先級(jí)控制

  使用USART0時(shí) 采用上電默認(rèn)值

  1234

  cc2530串口通信

  代碼

  /* 文件名稱:uart1.c

  * 功 能:CC2530系統(tǒng)實(shí)驗(yàn)-----單片機(jī)串口發(fā)送數(shù)據(jù)到PC

  * 描 述:實(shí)現(xiàn)從 CC2530 上通過串口每3秒發(fā)送字串“Hello ,I am CC2530 。\n ”,在PC端實(shí)驗(yàn)串口助手來接收數(shù)據(jù)。使用 CC2530 的串口 UART 0 ,波特率為 57600,其他參數(shù)為上電復(fù)位默認(rèn)值。

  */

  /* 包含頭文件 */

  #include “ioCC2530.h” //定義led燈端口

  #define LED1 P1_0 // P1_0定義為P1.0

  unsigned int counter=0; //統(tǒng)計(jì)定時(shí)器溢出次數(shù)

  void initUART0(void)

  {

  PERCFG = 0x00;

  P0SEL = 0x3c;

  U0CSR |= 0x80;

  U0BAUD = 216;

  U0GCR = 10;

  U0UCR |= 0x80;

  UTX0IF = 0; // 清零UART0 TX中斷標(biāo)志

  EA = 1; //使能全局中斷

  }

  /************************************************************

  * 函數(shù)名稱:inittTimer1

  * 功 能:初始化定時(shí)器T1控制狀態(tài)寄存器

  *************************************************************/

  void inittTimer1()

  {

  CLKCONCMD &= 0x80; //時(shí)鐘速度設(shè)置為32MHz

  T1CTL = 0x0E; // 配置128分頻,模比較計(jì)數(shù)工作模式,并開始啟動(dòng)

  T1CCTL0 |= 0x04; //設(shè)定timer1通道0比較模式

  T1CC0L =50000 & 0xFF; // 把50000的低8位寫入T1CC0L

  T1CC0H = ((50000 & 0xFF00) 》》 8); // 把50000的高8位寫入T1CC0H

  T1IF=0; //清除timer1中斷標(biāo)志

  T1STAT &= ~0x01; //清除通道0中斷標(biāo)志

  TIMIF &= ~0x40; //不產(chǎn)生定時(shí)器1的溢出中斷

  //定時(shí)器1的通道0的中斷使能T1CCTL0.IM默認(rèn)使能

  IEN1 |= 0x02; //使能定時(shí)器1的中斷

  EA = 1; //使能全局中斷

  }

  void UART0SendByte(unsigned char c)

  {

  U0DBUF = c;

  while (!UTX0IF); // 等待TX中斷標(biāo)志,即U0DBUF就緒

  UTX0IF = 0; // 清零TX中斷標(biāo)志

  }

  /**************************************************************

  * 函數(shù)名稱:UART0SendString

  * 功 能:UART0發(fā)送一個(gè)字符串

  **************************************************************/

  void UART0SendString(unsigned char *str)

  {

  while(*str != ‘\0’)

  {

  UART0SendByte(*str++); // 發(fā)送一字節(jié)

  }

  }

  /************************************************************

  * 功 能:定時(shí)器T1中斷服務(wù)子程序

  ************************************************************/

  #pragma vector = T1_VECTOR //中斷服務(wù)子程序

  __interrupt void T1_ISR(void)

  {

  EA = 0; //禁止全局中斷

  counter++; //統(tǒng)計(jì)T1的溢出次數(shù)

  T1STAT &= ~0x01; //清除通道0中斷標(biāo)志

  EA = 1; //使能全局中斷

  }

  /************************************************************

  * 函數(shù)名稱:main

  * 功 能:main函數(shù)入口

  *******************************************************/

  void main(void)

  {

  P1DIR |= 0x01; /* 配置P1.0的方向?yàn)檩敵?*/

  LED1 = 0;

  inittTimer1(); //初始化Timer1

  initUART0(); // UART0初始化

  while(1)

  {

  if(counter》=15)

  {

  counter=0;

  LED1 = 1;

  UART0SendString(“Hello ! I am CC2530 。\n”);

  LED1 = 0;

  }

  }

  }

非常好我支持^.^

(29) 8.6%

不好我反對

(308) 91.4%

( 發(fā)表人:龔婷 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?