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.
Hello!
I'm trying to make a code for my JY-MCU bluetooth to work with my PICCOLO controlstick F28069.
I used an external supply to deliver 5V to the bluetooth module. Since it was already configured, I can pair and connect to it successfully using my computer or Android.
To test the SCI, I opened the example: Example_2802xSci_Echoback.
It works just fine, I can see whatever it transmits and receives Using a terminal.
Then, I modified this code so I could actually use a GPIO that I could connect my bluetooth module. That's what I did:
So I connected RX of my module to GPIO12 and TX to GPIO7. In this module, when I send the command "AT" it should return the module name or version. But it doesn't return anything.
It gets stuck in the while loop.
Also I was thinking about the RX/TX level. The module requires a 3.3V logic level and I couldn't find in c2000 datasheet what is the voltage for a HIGH level. So I assume it is 3.3V as well.
Also, I'd like to know how can I write something to the terminal using those ports GPIO7 and 12?? In the echoback example, I noticed that if you transmit something ( scia_msg() ), it will appear in the terminal (just like a printf). Although, if I just change the ports to GPIO7 and 12 (since I will be using those), it won't display anything in the terminal when I transmit something.
ps: I have a code for arduino where I can configure it, and it works just fine.
Any ideas?
Thanks
Hi again, here it is. Nothing ommited.
// TI File $Revision: /main/4 $ // Checkin $Date: December 17, 2009 14:36:56 $ //########################################################################### // // FILE: Example_2802xSci_Echoback.c // // TITLE: DSP2802x Device SCI Echoback. // // ASSUMPTIONS: // // This program requires the DSP2802x header files. // As supplied, this project is configured for "boot to SARAM" operation. // // Connect the SCI-A port to a PC via a transciever and cable. // The PC application 'hypterterminal' can be used to view the data // from the SCI and to send information to the SCI. Characters recieved // by the SCI port are sent back to the host. // // As supplied, this project is configured for "boot to SARAM" // operation. The 2802x Boot Mode table is shown below. // For information on configuring the boot mode of an eZdsp, // please refer to the documentation included with the eZdsp, // // $Boot_Table // While an emulator is connected to your device, the TRSTn pin = 1, // which sets the device into EMU_BOOT boot mode. In this mode, the // peripheral boot modes are as follows: // // Boot Mode: EMU_KEY EMU_BMODE // (0xD00) (0xD01) // --------------------------------------- // Wait !=0x55AA X // I/O 0x55AA 0x0000 // SCI 0x55AA 0x0001 // Wait 0x55AA 0x0002 // Get_Mode 0x55AA 0x0003 // SPI 0x55AA 0x0004 // I2C 0x55AA 0x0005 // OTP 0x55AA 0x0006 // Wait 0x55AA 0x0007 // Wait 0x55AA 0x0008 // SARAM 0x55AA 0x000A <-- "Boot to SARAM" // Flash 0x55AA 0x000B // Wait 0x55AA Other // // Write EMU_KEY to 0xD00 and EMU_BMODE to 0xD01 via the debugger // according to the Boot Mode Table above. Build/Load project, // Reset the device, and Run example // // $End_Boot_Table // // // // DESCRIPTION: // // // This test recieves and echo-backs data through the SCI-A port. // // 1) Configure hyperterminal: // Use the included hyperterminal configuration file SCI_96.ht. // To load this configuration in hyperterminal: file->open // and then select the SCI_96.ht file. // 2) Check the COM port. // The configuration file is currently setup for COM1. // If this is not correct, disconnect Call->Disconnect // Open the File-Properties dialog and select the correct COM port. // 3) Connect hyperterminal Call->Call // and then start the 2802x SCI echoback program execution. // 4) The program will print out a greeting and then ask you to // enter a character which it will echo back to hyperterminal. // // // Watch Variables: // LoopCount for the number of characters sent // ErrorCount // // //########################################################################### // $TI Release: 2802x C/C++ Header Files V1.26 $ // $Release Date: February 2, 2010 $ //########################################################################### #include "DSP28x_Project.h" // Device Headerfile and Examples Include File // Prototype statements for functions found within this file. void scia_echoback_init(void); void scia_fifo_init(void); void scia_xmit(int a); void scia_msg(char *msg); // Global counts used in this example Uint16 LoopCount; Uint16 ErrorCount; Uint16 a = 0; Uint16 ReceivedChar = 0; void main(void) { char *msg; // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2802x_SysCtrl.c file. InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the DSP2802x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); Skipped for this example // For this example, only init the pins for the SCI-A port. // This function is found in the DSP2802x_Sci.c file. EALLOW; /* Enable internal pull-up for the selected pins */ /* Disable internal pull-up for the selected output pins to reduce power consumption. */ // Pull-ups can be enabled or disabled disabled by the user. // GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up for GPIO28 (SCIRXDA) // GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up for GPIO19 (SCIRXDA) GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up for GPIO7 (SCIRXDA) // GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; // Disable pull-up for GPIO29 (SCITXDA) // GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1; // Disable pull-up for GPIO18 (SCITXDA) GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; // Disable pull-up for GPIO12 (SCITXDA) /* Set qualification for selected pins to asynch only */ // Inputs are synchronized to SYSCLKOUT by default. // This will select asynch (no qualification) for the selected pins. // GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3; // Asynch input GPIO28 (SCIRXDA) // GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SCIRXDA) GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3; // Asynch input GPIO7 (SCIRXDA) /* Configure SCI-A pins using GPIO regs*/ // This specifies which of the possible GPIO pins will be SCI functional pins. // GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2; // Configure GPIO28 for SCIRXDA operation // GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // Configure GPIO19 for SCIRXDA operation GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2; // Configure GPIO7 for SCIRXDA operation // GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO29 for SCITXDA operation // GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; // Configure GPIO18 for SCITXDA operation GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for SCITXDA operation EDIS; // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP2802x_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2802x_DefaultIsr.c. // This function is found in DSP2802x_PieVect.c. InitPieVectTable(); // Step 4. Initialize all the Device Peripherals: // This function is found in DSP2802x_InitPeripherals.c // InitPeripherals(); // Not required for this example // Step 5. User specific code: LoopCount = 0; ErrorCount = 0; scia_fifo_init(); // Initialize the SCI FIFO scia_echoback_init(); // Initalize SCI for echoback msg = "\r\n\n\nHello World!\0"; scia_msg(msg); msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0"; scia_msg(msg); for(;;) { msg = "AT\0"; // Command that asks for info about the bluetooth. scia_msg(msg); // Wait for inc character while(SciaRegs.SCIFFRX.bit.RXFFST != 1) { } // wait for XRDY =1 for empty state // Get character ReceivedChar = SciaRegs.SCIRXBUF.all; // I still have to make a function to receive a whole "sentence" instead of only one char DELAY_US(2000000); msg = "AT+NAME\0"; // Command that sets for bluetooth name. scia_msg(msg); scia_msg("ZUERA\0"); // Set bluetooth name as ZUERA ReceivedChar = SciaRegs.SCIRXBUF.all; // Bluetooth replies with the name set DELAY_US(2000000); // Echo character back //msg = " You sent: \0"; //scia_msg(msg); //scia_xmit(ReceivedChar); LoopCount++; } } // Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scia_echoback_init() { // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICCR.bit.LOOPBKENA = 0; SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1; // SCI BRR = LSPCLK/(SCI BAUDx8) - 1 #if (CPU_FRQ_60MHZ) SciaRegs.SCIHBAUD =0x0000; // 9600 baud @LSPCLK = 15MHz (60 MHz SYSCLK). SciaRegs.SCILBAUD =0x00C2; #elif (CPU_FRQ_50MHZ) SciaRegs.SCHBAUD =0x0000; // 9600 baud @LSPCLK = 12.5 MHz (50 MHz SYSCLK) #elif (CPU_FRQ_40MHZ) =0x00A1; SciaRegs.SCIHBAUD =0x0000; // 9600 baud @LSPCLK = 10MHz (40 MHz SYSCLK). SciaRegs.SCILBAUD =0x0081; #endif SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset } // Transmit a character from the SCI void scia_xmit(int a) { while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {} SciaRegs.SCITXBUF=a; } void scia_msg(char * msg) { int i; i = 0; while(msg[i] != '\0') { scia_xmit(msg[i]); i++; } } // Initalize the SCI FIFO void scia_fifo_init() { SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x2044; SciaRegs.SCIFFCT.all=0x0; } //=========================================================================== // No more. //===========================================================================
Hi,
Sorry that I missed your updated post. GPIO config seems fine but on the hardware side, is your bluetooth module interfaced with TTL or RS-232 logic?
Also, nothing will get displayed on the PC as these GPIOs need to be converted to proper level.
Regards,
Gautam
Unfortunately the bluetooth module (HC-06) has a very poor datasheet. The only information I could find was in its name: It's called "HC-06 RS232 TTL module". So I cannot say for sure. I am still trying to find out for sure, but I'd say it is RS232.
Although, with the code above, I noticed that *sometimes* it partially works. By that I mean I can sometimes set the bluetooth name and it would actually change. And when it changes, it misses some characters or get them wrong.
For example, when I changed the name of it to "Testing this", and checked it on my android, the bluetooth network available was: "Te◘¶ing thᶲ◘"
Could this be a baudrate problem??
The bluetooth device is at a 9600 BR (default) and in the code the if statement in (CPU_FRQ_60MHZ) sets the communication to that BR too. If it is a BR problem then maybe the bluetooth device isn't at 9600 (even though it comes as default).
Yes, baud rate can be an issue but I've worked on this module and its sibling HC-05 and both respond really well. HC-05 module that I'd was a 5V logic based board and HC-06 was a 3.3V based. Hence you need to be clear that the module you've has an add-on board with 3.3V/5V friendly connections.
Here was the module-on-board pin-out that I'd:
If 3.3V then you can directly connect TX and RX to your controller and don't forget to connect both the grounds too.
Regards,
Gautam
Thanks a lot for the help Gautam, but I've found the problem: HC-06 was faulty.
I replaced it with another one (exactly the same model my friend happened to have) and it worked just fine.
Thanks again :)