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.

CC2560: UART CC2560 with ATTiny1634

Part Number: CC2560
Other Parts Discussed in Thread: CC2540

Hi, 

I am new user, i am trying to use PAN1326B for my project. but I dont know how to begin. Can you help me?

My project plan: I use ATTiny1634 to connect (UART) with PAN1326B (CC2560). i want to communicate with another device by bluetooth. 

I am using atmel studio to programm for it, and I use reference from https://github.com/RedBearLab/BLE_HCI/tree/master/arduino

Can I use HCI command from this library (CC2540) for my project (CC2560) ?

I am waiting for some components, so I cant test my circuit now. 

this my code:

Thank you so much 

hng

sorry for my bad english

/*
 * main.c
 *
 * Created: 6/26/2017 11:28:29 AM
 *  BLE_HCI central 
 */ 
#define F_CPU 8000000

#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "CPble_UART.h"
//#include "CPble_HCI_driver.h"
//#include "CPble_PCM_driver.h"
#include "CPble_MSPIM.h"
#include <stdlib.h>
#include <string.h>
#include "CPble_typedef.h"

char found_address[6];

char ble_event_process()
{
	//uint8_t type, event_code, data_len, status1;
	//uint16_t event;
	//uint8_t buf[64];
	char type, event_code, data_len, status1;
	char event;
	char buf[64];
	UART0_Init();
	// UART0_Receive(); receive a char, 
	type = UART0_Receive();
	_delay_ms(35);
	event_code = UART0_Receive();
	data_len = UART0_Receive();
	
	UART1_Init();
	SerialPrint1("-----------------------------\r\n");
	SerialPrint1("-Type :"); 
	SerialPrint1(type);
	SerialPrint1("\n");
	
	SerialPrint1("-EventCode :");
	SerialPrint1(event_code);
	SerialPrint1("\n");
	
	SerialPrint1("-Data Length :");
	SerialPrint1(data_len);
	SerialPrint1("\n");
	
		
	for (int i = 0; i < data_len; i++) {
	buf[i] = UART0_Receive();}
	
	event = BUILD_UINT16(buf[0], buf[1]);
	status1 = buf[2];
	
	SerialPrint1("-Event :");
	SerialPrint1(event);
	SerialPrint1("\n");
	
	SerialPrint1("-Status :");
	SerialPrint1(status1);
	SerialPrint1("\n");
	

	switch (event)
	{
		case 0x060D: // GAP_DeviceInformation
		{
			SerialPrint1("GAP_DeviceInformation:\n");
						
			int8_t rssi = buf[11];
			SerialPrint1("RSSI :");  // RSSI Receiev Signal Strength Indication
			SerialPrint1(rssi);
			SerialPrint1("\n");
			
			SerialPrint1("MAC Address:");
			SerialPrint1(buf[10]); SerialPrint1(buf[9]);SerialPrint1(buf[8]);SerialPrint1(buf[7]);SerialPrint1(buf[6]);SerialPrint1(buf[5]);
			SerialPrint1("\n");
			
		}
		break;
		
		case 0x0601: // GAP_DeviceDiscoveryDone
		{
			SerialPrint1("GAP_DeviceDiscoveryDone\n");
			

			uint8_t num_devs = buf[3];
			SerialPrint1("NumDevs :");  // RSSI Receiev Signal Strength Indication
			SerialPrint1(num_devs);
			SerialPrint1("\n");
			
			
			if (num_devs > 0)
			memcpy(found_address, &buf[6], 6); // store 1 device address only in this demo
		}
		break;
		
		case 0x051B: // ATT_HandleValueNotification
		{
			SerialPrint1("ATT_HandleValueNotification\r\n");
			
			uint8_t data[21] = {0};
			uint8_t len = data_len - 8;
			
			if (len > 20)
			len = 20;
			
			memcpy(data, &buf[8], len);
			
			SerialPrint1(" -------------> Received from cpble peripheral:");
			SerialPrint1(data);SerialPrint1("\n");
			
		}
		break;
		
		default:
		SerialPrint1(" -> No connecting\n");
	}
}


int main()
{
	SerialPrint1("Step1: cpble_central_init\n");
	cpble_central_init();
	SerialPrint1("Step2: ble_event_process\n");
	ble_event_process();
	int intval;
	UART1_Init();	
	while(1){
		char str = UART1_Receive();
		switch(str)
		{
			case 'D':
			case 'd':
			SerialPrint1(" -> Start discovery...\r\n");
			cpble_central_start_discovery();
			break;
			
			case 'E':
			case 'e':
			SerialPrint1(" -> Connecting to cpble peripheral...\r\n");
			cpble_central_connect(found_address);
			break;
			
			case 'N':
			case 'n':
			SerialPrint1(" -> Enable notification to receive data...\r\n");
			cpble_central_enable_notification();
			break;
			
			case '1':
			SerialPrint1(" -> Send \"Hello World!\" to the cpble peripheral...\r\n");
			cpble_central_write_bytes((uint8_t *)"Hello World!\r\n", 14);
			break;
			
			case '2':
			SerialPrint1(" -> Send \"I love BLE!\" to the cpble peripheral...\r\n");
			cpble_central_write_bytes((uint8_t *)"I love BLE!\r\n", 13);
			break;

			default:
			SerialPrint1(" -> Invalid command.\r\n");
		}
	}
	
}

/*
int main()
{
	//int byte, val, val1;
	int intval; 
	char str[30];
	intval = 50; 
	//itoa(intval, str, 10); 
	//convI8toStr(str, intval); 
	adc_init();
	UART0_Init();
	UART1_Init();
	while(1){
		/*print adc value ****A 
		int adc_value = read_adc(0x03);// 0x03 pin PA6
		itoa(adc_value, str, 10);
		// receive data from port0
		//Serialgets0(str);
		// send back data from port1
		SerialPrint1("the ADC value: ");
		SerialPrint1(str);SerialPrint1("\n");
		 
		//str[0] = UART0_Receive();
		//byte=atoi(str); // return integer values
		//UART0_Init();
		//UART0_Sendstr(str);//SerialPrint1("\n");
		
		
	}
}
*/
/*    ready and replay
int main()
{
	//int byte, val, val1;
	uint8_t intval; 
	char str[30];
	char buf;
	UART1_Init();
	while(1){
		//*print adc value ****A 
		Serialgets1(str);
		//intval = atoi(str);  // return integer values
		//str[0] = UART1_Receive();
		//intval=atoi(str); 
		//UART0_Init();
		SerialPrint1(str);
				
	}
}
*/


/*


int main(void) {
	UART1_Init();
	SerialPrint1("Start:\n");
	SerialPrint1("Wait for data:\n");
	unsigned char receivedata;
	//int val;
	while(1) {
		// doesnt work
		receivedata = UART1_Receive();
		SerialPrint1(receivedata);
		//SerialPrint0(""Start:\n");
		//SerialPrint1("Hello the world\n");
		_delay_ms(500);
		// Send back
		//SerialPrint0("echo:\n");
		//_delay_ms(200);
		//SerialPrint0(receivedata);
			//UART0_Transmit(receivedata);
	   //	_delay_ms(200);
			
		}
}
*/
/*
int main()
{
	int byte, val, val1;
	char str[20];
	UART0_Init();
	while(1){
	
	Serialgets(str);
	byte=atoi(str);
	val = atoi(str);
	// sprintf(str,"data retrived from mem= 0x%x\n", val );
	//sprintf(str)
	SerialPrint0("String value ="); 
	SerialPrint0(str);
	SerialPrint0("\n");
	SerialPrint0("Int value =");
	SerialPrint0(val1);
	SerialPrint0("\n");

	strcpy(str, "tutorialspoint.com");
	val = atoi(str);
	val1 = sprintf(str,"data retrived from mem= 0x%x\n", val );
	SerialPrint0("String value =");
	SerialPrint0(str);
	SerialPrint0("\n");
	SerialPrint0("Int value =");
	SerialPrint0(val1);
	SerialPrint0("\n");

	//return(0);
	//}
}
*/
/*
 * CPble_hci.c
 *
 * Created: 6/30/2017 1:19:10 PM
 *  
 */ 
//#include <AltSoftSerial.h>
#include "CPble_typedef.h"
#include "CPble_hci.h"
#include <string.h>
#include <stdio.h>
#include <stdint.h>


uint8_t GAP_DeviceInit( uint8_t taskID, uint8_t profileRole, uint8_t maxScanResponses, uint8_t *pIRK, uint8_t *pSRK, uint32_t *pSignCounter )
{
	uint8_t buf[42];
	uint8_t len = 0;
	
	buf[len++] = 0x01;                  // -Type    : 0x01 (Command)
	buf[len++] = 0x00;                  // -Opcode  : 0xFE00 (GAP_DeviceInit)
	buf[len++] = 0xFE;
	
	buf[len++] = 0x26;                  // -Data Length 0x26bytes (38bytes) = 1 + 1 + 16 + 16 + 4
	buf[len++] = profileRole;           //  Profile Role
	buf[len++] = maxScanResponses;      //  MaxScanRsps
	memcpy(&buf[len], pIRK, 16);        //  IRK // copy 16bytes from pIRK to buf[]
	len += 16;
	memcpy(&buf[len], pSRK, 16);        //  SRK // copy 16bytes from pSRK to buf[]
	len += 16;
	memcpy(&buf[len], pSignCounter, 4); //  SignCounter // copy 4bytes from pSignCounter to buf[] 
	len += 4;
	
	UART0_Init();
	SerialPrintln0(buf, len);
	//AltSoftSerial.write(buf, len);
	
	return 1;
}

uint8_t GAP_DeviceDiscoveryRequest( gapDevDiscReq_t *pParams )
{
	uint8_t buf[20];
	uint8_t len = 0;
	
	buf[len++] = 0x01;                  // -Type    : 0x01 (Command)
	buf[len++] = 0x04;                  // -Opcode  : 0xFE04 (GAP_DeviceDiscoveryRequest)
	buf[len++] = 0xFE;
	
	buf[len++] = 0x03;                 // -Data Length 0x03bytes (3bytes) = 1 + 1 + 1
	buf[len++] = pParams->mode;        //  Mode
	buf[len++] = pParams->activeScan;  //  ActiveScan
	buf[len++] = pParams->whiteList;   //  WhiteList
	
	//  hci_tl_write(buf, len);
	//  hci_tl_wait_for_response();
	UART0_Init();
	SerialPrintln0(buf, len);
	//AltSoftSerial.write(buf, len);
	

	return 1;
}

uint8_t GAP_EstablishLinkReq( gapEstLinkReq_t *pParams )
{
	uint8_t buf[20];
	uint8_t len = 0;
	
	buf[len++] = 0x01;   // 
	memcpy(&buf[len], "\x09\xFE", 2);
	len += 2;
	
	buf[len++] = 0x03 + B_ADDR_LEN;
	
	buf[len++] = pParams->highDutyCycle;
	buf[len++] = pParams->whiteList;
	buf[len++] = pParams->addrTypePeer;
	memcpy(&buf[len], pParams->peerAddr, B_ADDR_LEN);
	len+=B_ADDR_LEN;

	UART0_Init();
	SerialPrintln0(buf, len);
	return 1;
}

uint8_t GATT_WriteCharValue( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId )
{
	uint8_t buf[20];
	uint8_t len = 0;
	
	buf[len++] = 0x01;
	memcpy(&buf[len], "\x92\xFD", 2);
	len += 2;
	
	buf[len++] = 0x04 + pReq->len;
	
	memcpy(&buf[len], &connHandle, 2);
	len += 2;
	memcpy(&buf[len], &pReq->handle, 2);
	len += 2;
	memcpy(&buf[len], pReq->value, pReq->len);
	len += pReq->len;
	
	UART0_Init();
	SerialPrintln0(buf, len);

	return 1;
}

uint8_t GATT_WriteNoRsp( uint16_t connHandle, attWriteReq_t *pReq, uint8_t taskId )
{
	uint8_t buf[20];
	uint8_t len = 0;
	
	buf[len++] = 0x01;
	memcpy(&buf[len], "\xB6\xFD", 2);
	len += 2;
	
	buf[len++] = 0x04 + pReq->len;
	
	memcpy(&buf[len], &connHandle, 2);
	len += 2;
	memcpy(&buf[len], &pReq->handle, 2);
	len += 2;
	memcpy(&buf[len], pReq->value, pReq->len);
	len += pReq->len;
	UART0_Init();
	SerialPrintln0(buf, len);
	//AltSoftSerial.write(buf, len);
	return 1;
}

/***********************************
* Master device
*************************************/
/*
void biscuit_central_init()
{
	GAPCentralRole_StartDevice();
}
static uint8_t gapCentralRoleTaskId = 0;
static uint8_t  gapCentralRoleIRK[KEYLEN] = {0};
static uint8_t  gapCentralRoleSRK[KEYLEN] = {0};
static uint32_t gapCentralRoleSignCounter = 1;
static uint8_t  gapCentralRoleBdAddr[B_ADDR_LEN];
static uint8_t  gapCentralRoleMaxScanRes = 5;
*/

static uint8_t gapCentralRoleTaskId = 0;
static uint8_t  gapCentralRoleIRK[KEYLEN] = {0};
static uint8_t  gapCentralRoleSRK[KEYLEN] = {0};
static uint32_t gapCentralRoleSignCounter = 1;
static uint8_t  gapCentralRoleBdAddr[B_ADDR_LEN];
static uint8_t  gapCentralRoleMaxScanRes = 5;

uint8_t GAPCentralRole_StartDevice()
{
	// gapCentralRoleTaskId = 0, 
	// GAP_PROFILE_CENTRAL = 0x08
	// gapCentralRoleMaxScanRes = 5
	// gapCentralRoleIRK = gapCentralRoleIRK[KEYLEN] = {0}; // KEYLEN= 16
	// gapCentralRoleSRK = {0};
	// gapCentralRoleSignCounter = 1
	return GAP_DeviceInit( gapCentralRoleTaskId, GAP_PROFILE_CENTRAL,
	gapCentralRoleMaxScanRes, gapCentralRoleIRK,
	gapCentralRoleSRK, &gapCentralRoleSignCounter );
}

uint8_t GAPCentralRole_EstablishLink( uint8_t highDutyCycle, uint8_t whiteList, uint8_t addrTypePeer, uint8_t *peerAddr )
{
	gapEstLinkReq_t params;

	params.taskID = gapCentralRoleTaskId;
	params.highDutyCycle = highDutyCycle;
	params.whiteList = whiteList;
	params.addrTypePeer = addrTypePeer;
	memcpy( params.peerAddr, peerAddr, B_ADDR_LEN );

	return GAP_EstablishLinkReq( &params );
}

uint8_t GAPCentralRole_StartDiscovery( uint8_t mode, uint8_t activeScan, uint8_t whiteList )
{
	gapDevDiscReq_t params;

	params.taskID = gapCentralRoleTaskId;
	params.mode = mode;
	params.activeScan = activeScan;
	params.whiteList = whiteList;

	return GAP_DeviceDiscoveryRequest( &params );
}

CPble_hci.hCPble_typedef.h

3487.pic.docx