SparkFun Forums 

Where electronics enthusiasts find answers.

Everything ARM and LPC
By janak

I am trying to read ADC channel values from MCP3911 using MSP launchpad using SPI protocol. When i used Arduino Mega the protocol is working fine. But when i use any TI devices i am having a problem, it always gives me all 0'S or 1's.

I am using energia for MSP devices. Any i have chosen the appropriate pins as defined in the enegia pin layout.

static const uint8_t SS = 8; /* P2.7 */
static const uint8_t SCK = 7; /* P3.2 */
static const uint8_t MOSI = 15; /* P3.0 */
static const uint8_t MISO = 14; /* P3.1 */

Can someone help me troubleshoot where i am going wrong.

Thanks in advance.
Code: Select all
// SPI Stuff here
#include "SPI.h"
const uint8_t MCP3911_CS = SS; // Teensy SPI CS1 = MCP3911

void setup() {

  //SPI Bus setup
  digitalWrite(MCP3911_CS,HIGH); //
  pinMode (MCP3911_CS, OUTPUT); // MCP3911

  SPI.setClockDivider(SPI_CLOCK_DIV8); //i.e. 6MHz on a Teensy running at 48MHz. 

  //Setup Serial Comms
  Write_MCP3911_Register (0x0D, B11000010); 

int32_t adc;
void loop()
  //adc = Read_MCP3911_24bit(0x00);
//  Serial.print("Ch0 :  ");
//  Serial.println(adc);

uint8_t Write_MCP3911_Register (uint8_t MCP3911_Register_Address, uint8_t Command) {
  Serial.print("Command Register Received: ");
  Serial.print(" - Command Received: ");

  MCP3911_Register_Address <<= 1;   //left shift address one digit
  MCP3911_Register_Address &= B00111110; // and ensure last digit is a zero for write command
  digitalWrite(MCP3911_CS, LOW); // now take CS low to enable SPI device
  SPI.transfer(MCP3911_Register_Address); // send address with write command to MCP3911
  SPI.transfer(Command); //now send payload
  digitalWrite(MCP3911_CS, HIGH); // deselect the CS pin. 

  Serial.print(" Write Command Byte Sent: ");
  Serial.println(MCP3911_Register_Address,BIN); // verify what command was sent (i.e. address and write bit = 0)

  //Now Verify all went well. If so, have the function return value of one,
  //otherwise, alert the user that something is amiss. 
  uint8_t Response = Read_MCP3911_Register (MCP3911_Register_Address>>1);
  if (Response == Command)  return 1;
    Serial.print("Error for register: ");
    Serial.print(" - Command Sent: ");
    Serial.print(" - Response Received: ");
    return 0;

uint8_t Read_MCP3911_Register (uint8_t MCP3911_Register_Address) {
  MCP3911_Register_Address <<=1; //left shift address one bit for command byte 
  MCP3911_Register_Address |=1; // Ensure read bit is set
  Serial.print("  Read Byte Command Sent: ");
  digitalWrite(MCP3911_CS, LOW); 
  SPI.transfer(MCP3911_Register_Address); // send address with read command to MCP3911
  uint8_t Response = SPI.transfer(0x00); 
  digitalWrite(MCP3911_CS, HIGH);
  Serial.print(" - Response Received: ");
  return Response;

void Reset_ADC()
 // Puts ADC into Reset Mode, i.e. stops ADC conversions until setup is complete.
  Write_MCP3911_Register (0x0D, B11000010); 

int32_t Read_MCP3911_24bit( uint8_t MCP3911_Register_Address)
    uint8_t HB,MB,LB=0, MCP3911_CTRL=0;;
    int32_t adc0code=0;
    MCP3911_CTRL = 0;
    MCP3911_CTRL =(MCP3911_Register_Address<<1); //left shift address one digit for write command
    MCP3911_CTRL |= 1; //Turn on Read Operation by toggling last bit on
    digitalWrite(MCP3911_CS, LOW);
    SPI.transfer(MCP3911_CTRL); // send command byte to MCP3911
    HB = SPI.transfer(0x0);//receive High Byte
    MB = SPI.transfer(0x0);//receive Middle Byte
    LB = SPI.transfer(0x0);//receive Low Byte
    digitalWrite(MCP3911_CS, HIGH);
    adc0code = HB;
    adc0code = adc0code<<8;
    adc0code |= MB;
    adc0code = adc0code<<8;
    adc0code |= LB;         //connecting the 3 bytes to one number
    return adc0code;// returning result