CC2500 Module **การใช้งานโค้ด


cc2500 เป็น module ใช้สำหรับส่ง-รับ สัญญาณวิทยุ ซึ่งมีขนาดเล็กและความสามารถมากมายโดยเราสามารถปรับย่านความถี่ในการส่งข้อมูล ,สามารถระบุ addressของตัวรับได้ ,ส่งsignal interupt บอกได้เมื่อได้รับข้อมูลหรือส่งข้อมูลเรียบร้อย  , etc.
การทำงานของ cc2500 จะใช้ Vcc ในการเลี้ยงบอร์ด 3.3v และสามารถคอนฟิกregister หรือสั่งการทำงาน รับ-ส่งข้อมูลได้ โดยใช้การสื่อสารแบบ SPI  กับตัว MCU แต่ codeตัวอย่างมีฟังก์ชั่นในส่วนของ spi ไว้ไห้แล้วเพียงแค่ define mosi(master out,slave in) ,miso(master in,slave out), clk(clock), csn(enable) และ gdo0(output ของ cc2500) ก็จะสามารถใช้งาน code ตัวอย่างได้
โดยต้องเชื่อมต่อระหว่าง mcu กับ cc2500ดังนี้

 Mcu                               cc2500

mosi ————————— si

miso ————————— so

clk   ————————— clk

csn —————————- csn

gnd ————————— gnd

+3.3v ————————- vdd

gdo0 ————————- gdo0

การทำงานจะต้อง config register ต่างๆของ cc2500 ไห้ทำงานตามที่ต้องการ โดย codeตัวอย่างได้สั่งให้ cc2500 set channel ได้, ต้องระบุ address ในการรับ-ส่งข้อมูล, และ interupt เมื่อมีการรับหรือส่งข้อมูล ,set tx_fifo ที่ 32 byte rx_fifo ที่ 33 byte ,auto crc

**********โดยที่ฟังก์ชั่นในการ setting register  คือฟังก์ชั่น setting();

และหลังจากที่เรียกใช้ฟังก์ชั่น setting(); เราจะสามารถใช้ฟังก์ชั่น configure_TX(); เพื่่อไห้ cc2500 เปลี่ยนเป็นสถานะ transmit(ส่งข้อมูล) และเรียกฟังก์ชั่น configure_RX(); เพื่อไห้ cc2500 เปลี่ยนเป็นสถานะ recieve(รับข้อมูล)

**********ในcode ตัวอย่างจะมี array ไห้สองตัวเพื่อใช้สำหรับส่งและรับข้อมูลซึ่งหากต้องการส่งข้อมูลจะต้องกำหนดค่าใน array ตาม packetดังนี้

packet lenght,address,data,data
โดย packet lenght,address,data จะมีความยาวแค่ 1 byte และ packet lenght = (จำนวนข้อมูลที่ต้องการส่ง (data) )+( 1 byte ของaddress)
เช่นต้องการส่ง LIL ไปที่ address 0x00 จะต้องส่งข้อมูลดังนี้
packet lenght   ,address    ,  data      ,   data   ,   data
4                 0                 L                I            L

ซึ่งใน code จะมี array TX_Data[10] ไว้ให้สำหรับเป็น array ที่ใช้ในการส่งข้อมูล
เพราะฉะนั้นหากต้องการส่งข้อมูล int 58 และ 78 จะต้องใส่ค่าใน array TX_Data  ไปที่ address 0x00 ดังนี้
TX_Data[0]= 4

TX_Data[1]= 0

TX_Data[2]= “L”

TX_Data[3]= “I”

TX_Data[4]= “L”
แล้วเรียกใช้ function transmit_data(TX_Data[0]);  ส่งตัวแปร TX_Data[0] ที่เป็นตัวแปรที่เก็บข้อมูล packet lenght เพื่อให้ฟังก์ชั่นนำไปวน loop ส่ง(ในที่นี้จะวน loop สี่รอบเพราะ packet lenght = 4)
และเมื่อmoduleเริ่มส่งข้อมูลก็จะมี interupt บอกที่ขา gdo0 เปลี่นรเป็น high และเมื่อส่งข้อมูลเสร็จสิ้นขา gdo จะกลับมาเป็น low

ในส่วนของตัวรับ เมื่อเรียกฟังก์ชั่น configure_RX(); แล้ว cc2500 จะส่ง interupt ออกมาทุกครั้งเมื่อสามารถตรวจจับสัญญาณที่ตรงกับของตัวเองได้ และจะประมวลผลตามนี้
1.ตรวจสอบว่าข้อมูลที่รับได้ มี address ตรงกับของตัวเองหรือไม่
2.เช็ค crc
ถ้าaddress ตรงกับตัวเอง และ crc ถูกต้องจะนำข้อมูลทั้งหมดเก็บไว้ใน RX_fifo ซึ่งจะทำให้ RX_fifo ไม่ว่าง
********* เพราะฉะนั้นเมื่อมีการ interupt เข้ามาเราจะต้องเช็คว่าใน RX_fifo มีข้อมูลอยู่หรือไม่ถ้ามีแสดงว่าได้รับข้อมูลเรียบร้อ
********
Array RX_Data เป็นarray ที่โค้ดจะเขียนข้อมูลที่ cc2500รับข้อมูลได้ลงไปและลำดับpacketจะเหมือนกับตอนส่งเช่นรับข้อมูลได้ว่า LIL
RX_Data[0] = 4 (packet lenght)
RX_Data[1] = address
RX_Data[2] = “L”
RX_Data[3] = “I”
RX_Data[4] = “L”

packet จะเหมือนกับ packet ตอนที่ส่งมาทุกประการ

******
0x3d เป็นข้อมูลเดียวที่ cc2500 ได้รับแล้วจะไม่ทำงานอะไร
เพราะฉะนั้นในหากต้องการอ่านค่าจาก cc2500 ไม่ว่าจะเป็นสถานะ หรือข้อมูลใน register จำเป็นต้องเขียนข้อมูล 0x3d กลับไปทุกครั้ง เนื่องจากเมื่อ csn เปลี่ยนสถานะเป็น low cc2500 มันจะเขียนค่าสถานะกลับมาพร้อมทั้งอ่านข้อมูลที่ mcu ส่งไปเพื่อทำงานทุกครั้ง

Leave a comment

Your email address will not be published. Required fields are marked *