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.
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.
// 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
}