Hi,
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.
msp430-----
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?
Will there be anyother connections running between MSP and MCP other than SS, SCK, MOSI, MISO?
Where to connect GND? and is it required for the SPI?
Oscilloscope shows the MOSI line from MSP is outputting data as expected. Also will pullup, pulldown states of pins matter?
If u have a moment, it would be great if you can try the code I posted above and see if ur having any issues on your setup.
Buy the way, I am using MSP430FF5529 launchpad, energia 17..
Thanks in advance.
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.
msp430-----
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?
Code:
// 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.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV8); //i.e. 6MHz on a Teensy running at 48MHz.
SPI.begin();
//Setup Serial Comms
Serial.begin(115200);
Write_MCP3911_Register (0x0D, B11000010);
}
int32_t adc;
void loop()
{
//adc = Read_MCP3911_24bit(0x00);
Read_MCP3911_Register(0x0D);
// Serial.print("Ch0 : ");
// Serial.println(adc);
delay(200);
}
uint8_t Write_MCP3911_Register (uint8_t MCP3911_Register_Address, uint8_t Command) {
Serial.print("Command Register Received: ");
Serial.print(MCP3911_Register_Address,HEX);
Serial.print(" - Command Received: ");
Serial.println(Command,BIN);
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;
else
{
Serial.println("");
Serial.print("Error for register: ");
Serial.print(MCP3911_Register_Address>>1,BIN);
Serial.print(" - Command Sent: ");
Serial.print(Command,BIN);
Serial.print(" - Response Received: ");
Serial.println(Response,BIN);
Serial.println("");
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: ");
Serial.print(MCP3911_Register_Address,BIN);
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: ");
Serial.println(Response,BIN);
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
}
Will there be anyother connections running between MSP and MCP other than SS, SCK, MOSI, MISO?
Where to connect GND? and is it required for the SPI?


Oscilloscope shows the MOSI line from MSP is outputting data as expected. Also will pullup, pulldown states of pins matter?
If u have a moment, it would be great if you can try the code I posted above and see if ur having any issues on your setup.
Buy the way, I am using MSP430FF5529 launchpad, energia 17..
Thanks in advance.