Part Number:TMS320F28377D
Tool/software: Code Composer Studio
Hi,
I want to use GPIO48 and GPIO49 as Tx and Rx of serial communication. I need to change GMUX and MUX registers. In TI library (F2837xD_Gpio.c) there is a function void GPIO_SetupPinMux(Uint16 pin, Uint16 cpu, Uint16 peripheral). I use this function to change registers. Mux register (GPBMUX2) is changed correctly, but Group Mux register (GPBGMUX2) is not changed properly. It writes always zero instead of proper value. If I write correct value into group multiplex register, everything works.
In datasheet (tms320f28377d.pdf, page 41, Table 4-3) or technical reference manual (spruhm8g.pdf, page 914, Table 7-8) ther is a column with name GPIO index.
What is GPIO index? Shall I write something into some registers for this index?
Here is the funcntion in TI library (F2837xD_Gpio.c)
// // GPIO_SetupPinMux - Set the peripheral muxing for the specified pin. The // appropriate parameters can be found in the GPIO Muxed // Pins table(4.4) in the datasheet. Use the GPIO index // row (0 to 15) to select a muxing option for the GPIO. // void GPIO_SetupPinMux(Uint16 pin, Uint16 cpu, Uint16 peripheral) { volatile Uint32 *gpioBaseAddr; volatile Uint32 *mux, *gmux, *csel; Uint16 pin32, pin16, pin8; pin32 = pin % 32; pin16 = pin % 16; pin8 = pin % 8; gpioBaseAddr = (Uint32 *)&GpioCtrlRegs + (pin/32) * GPY_CTRL_OFFSET; // //Sanity check for valid cpu and peripheral values // if (cpu > GPIO_MUX_CPU2CLA || peripheral > 0xF) return; // //Create pointers to the appropriate registers. This is a workaround //for the way GPIO registers are defined. The standard definition //in the header file makes it very easy to do named accesses of one //register or bit, but hard to do arbitrary numerical accesses. It's //easier to have an array of GPIO modules with identical registers, //including arrays for multi-register groups like GPyCSEL1-4. But //the header file doesn't define anything we can turn into an array, //so manual pointer arithmetic is used instead. // mux = gpioBaseAddr + GPYMUX + pin32/16; gmux = gpioBaseAddr + GPYGMUX + pin32/16; csel = gpioBaseAddr + GPYCSEL + pin32/8; // //Now for the actual function // EALLOW; // //To change the muxing, set the peripheral mux to 0/GPIO first to avoid //glitches, then change the group mux, then set the peripheral mux to //its target value. Finally, set the CPU select. This procedure is //described in the TRM. Unfortunately, since we don't know the pin in //advance we can't hardcode a bitfield reference, so there's some //tricky bit twiddling here. // *mux &= ~(0x3UL << (2*pin16)); *gmux &= ~(0x3UL << (2*pin16)); *gmux |= (Uint32)((peripheral >> 2) & 0x3UL) << (2*pin16); *mux |= (Uint32)(peripheral & 0x3UL) << (2*pin16); *csel &= ~(0x3L << (4*pin8)); *csel |= (Uint32)(cpu & 0x3L) << (4*pin8); // //WARNING: This code does not touch the analog mode select registers, //which are needed to give the USB module control of its IOs. // EDIS; }