Tool/software: Code Composer Studio
Hello All,
I am working on SPI based Digital pot ( 10K ) MCP4152103.
I am not able to initializing Pot. could you please tell me if i did anything wrong in the below code.
//*****************************************************************************
//
// Digitalpot.c - Example demonstrating how to configure SSI2 in TI master mode.
//
// Copyright (c) 2010-2017 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// This is part of revision 2.1.4.178 of the Tiva Firmware Development Package.
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/pwm.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/adc.h"
#include "driverlib/timer.h"
#include "math.h"
#include "driverlib/ssi.h"
#include "driverlib/qei.h"
//*****************************************************************************
//
//! \addtogroup ssi_examples_list
//! <h1>TI Master (ti_master)</h1>
//!
//! This example shows how to configure the SSI0 as TI Master. The code will
//! send three characters on the master Tx then poll the receive FIFO until
//! 3 characters are received on the master Rx.
//!
//! This example uses the following peripherals and I/O signals. You must
//! review these and change as needed for your own board:
//! - SSI2 peripheral
//! - GPIO Port B peripheral (for SSI2 pins)
//! - SSI2Clk - PB4
//! - SSI2Fss - PB5
//! - SSI2Rx - PB6
//! - SSI2Tx - PB7
//!
//! The following UART signals are configured only for displaying console
//! messages for this example. These are not required for operation of I2C0.
//! - UART0 peripheral
//! - GPIO Port A peripheral (for UART0 pins)
//! - UART0RX - PA0
//! - UART0TX - PA1
//!
//! This example uses the following interrupt handlers. To use this example
//! in your own application you must add these interrupt handlers to your
//! vector table.
//! - None.
//
//*****************************************************************************
// DigitalPot Command Byte for Digital Pot Reading and writing.
//
//*****************************************************************************
#define COMMAND_WRITE 0x40
#define COMMAND_READ 0x4C
//*****************************************************************************
//
// Transmit FIFO and Receive FIFO
//
//*****************************************************************************
uint32_t pui32DataTx;
uint32_t pui32DataRx;
//*****************************************************************************
//
// This Function is used to Enable the all peripheral clocks.
// A,B,C,D,E and F
//*****************************************************************************
void InitModules(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
}
//*****************************************************************************
//
// This function sets up UART0 to be used for a console to display information
// as the example is running.
//
//*****************************************************************************
void
InitConsole(void)
{
//
// Enable UART0 so that we can configure the clock.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
//
// Configure the pin muxing for UART0 functions on port A0 and A1.
// This step is not necessary if your part does not support pin muxing.
// TODO: change this to select the port/pin you are using.
//
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//
// Use the internal 16MHz oscillator as the UART clock source.
//
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
//
// Select the alternate (UART) function for these pins.
// TODO: change this to select the port/pin you are using.
//
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Initialize the UART for console I/O.
//
UARTStdioConfig(0, 115200, 16000000);
}
//*****************************************************************************
//
// Configure SSI2 in Master TI mode. This example will send out 10 bytes of
// data, then wait for 3 bytes of data to come in. This will all be done using
// the interrupt method.
//
//*****************************************************************************
void
InitSSI2(void)
{
//
// The SSI0 peripheral must be enabled for use.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
//
//
// Configure the pin muxing for SSI2 functions on port A2, A3, A4, and A5.
// This step is not necessary if your part does not support pin muxing.
// TODO: change this to select the port/pin you are using.
//
GPIOPinConfigure(GPIO_PB4_SSI2CLK);
// GPIOPinConfigure(GPIO_PB5_SSI2FSS);
GPIOPinConfigure(GPIO_PB6_SSI2RX);
GPIOPinConfigure(GPIO_PB7_SSI2TX);
//
// Configure the GPIO settings for the SSI pins. This function also gives
// control of these pins to the SSI hardware. Consult the data sheet to
// see which functions are allocated per pin.
// The pins are assigned as follows:
// PB7 - SSI0Tx
// PB6 - SSI0Rx
// PB5 - SSI0Fss
// PB4 - SSI0CLK
// TODO: change this to select the port/pin you are using.
//
GPIOPinTypeSSI(GPIO_PORTB_BASE,GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_4);
//
// Configure PB2,PE0,PF0,PA6 pins for digital pot slave select
//
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_2);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_6);
//
// Unlock the PF0 pin
//
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01;
HWREG(GPIO_PORTF_BASE + GPIO_O_AFSEL) |= 0x400;
HWREG(GPIO_PORTF_BASE + GPIO_O_DEN) |= 0x01;
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;
//
// Configure and enable the SSI port for TI master mode. Use SSI2, system
// clock supply, master mode, 1MHz SSI frequency, and 8-bit data.
//
SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(),SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER,50000, 16);
//
// Enable SSI2 module
//
SSIEnable(SSI2_BASE);
//
// Make Chip select pins as High
//
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,GPIO_PIN_6);
//
// Read any residual data from the SSI port. This makes sure the receive
// FIFOs are empty, so we don't read any unwanted junk. This is done here
// because the TI SSI mode is full-duplex, which allows you to send and
// receive at the same time. The SSIDataGetNonBlocking function returns
// "true" when data was returned, and "false" when no data was returned.
// The "non-blocking" function checks if there is any data in the receive
// FIFO and does not "hang" if there isn't.
//
while(SSIDataGetNonBlocking(SSI2_BASE, &pui32DataRx))
{
}
}
//*****************************************************************************
//
// This function is used to send 16 bit data over SSI2 bus
//
//*****************************************************************************
bool
SSI2_MCP41HV51_Write (uint32_t ulDataTx,uint32_t channel)
{
uint32_t validity = false;
pui32DataTx = 0x4200 | (ulDataTx & 0xff);
// pui32DataTx = ulDataTx;
switch(channel)
{
case 1: GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,~GPIO_PIN_2);
SysCtlDelay(100);
// SSIDataPut(SSI2_BASE, 0x0000);
SSIDataPut(SSI2_BASE, pui32DataTx);
while(SSIBusy(SSI2_BASE));
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2);
SysCtlDelay(100);
validity = true;
break;
case 2: GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,~GPIO_PIN_0);
SysCtlDelay(100);
SSIDataPut(SSI2_BASE, pui32DataTx);
while(SSIBusy(SSI2_BASE));
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_PIN_0);
SysCtlDelay(100);
validity = true;
break;
case 3: GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,~GPIO_PIN_0);
SysCtlDelay(100);
SSIDataPut(SSI2_BASE, pui32DataTx);
while(SSIBusy(SSI2_BASE));
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
SysCtlDelay(100);
validity = true;
break;
case 4: GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,~GPIO_PIN_6);
SysCtlDelay(100);
SSIDataPut(SSI2_BASE, pui32DataTx);
while(SSIBusy(SSI2_BASE));
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,GPIO_PIN_6);
SysCtlDelay(100);
validity = true;
break;
default:GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,GPIO_PIN_6);
validity = false;
}
return validity;
}
//*****************************************************************************
//
// Main function entry starts here
//
//*****************************************************************************
int
main(void)
{
uint32_t Rx_Data[10] = {0};
uint32_t count = 0;
//
// Set the clocking to run directly from the external crystal/oscillator.
// TODO: The SYSCTL_XTAL_ value must be changed to match the value of the
// crystal on your board.
//
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
//
// Set up the serial console to use for displaying messages.
//
InitModules();
InitConsole();
InitSSI2();
SSI2_MCP41HV51_Write(0x00,1);
SysCtlDelay(10000);
SSI2_MCP41HV51_Write(0xff,1);
SysCtlDelay(10000);
while(1)
{
// //
// // Receive command the data from UART to control the Digital pot
// //
// while(UARTCharsAvail(UART0_BASE))
// {
// Rx_Data[count] = UARTCharGetNonBlocking(UART0_BASE);
//
// if( Rx_Data[count] == '@')
// {
// uint32_t Channel = Rx_Data[0] - 48;
// uint32_t Data = ((Rx_Data[2] - 48) * 100) + ((Rx_Data[3] - 48) * 10) + (Rx_Data[4] - 48);
// SSI2_MCP41HV51_Write(Data,Channel);
// count = 0;
// }
// else
// {
// count++;
// }
// }
SSI2_MCP41HV51_Write(0x80,1);
SysCtlDelay(10000);
// SSI2_MCP41HV51_Write(0x10,2);
// SysCtlDelay(100);
//
// SSI2_MCP41HV51_Write(0x20,3);
// SysCtlDelay(100);
//
// SSI2_MCP41HV51_Write(0x30,4);
// SysCtlDelay(100);
}
}