Skip to main content
Topic: Max6662 Temp Sensor and Half-Duplex SPI (Read 1807 times) previous topic - next topic

Max6662 Temp Sensor and Half-Duplex SPI

Hi, i'm trying to establish communication with a Max6662 Temp Sensor and I am having difficulty.  The temperature is stored in a register on the max6662 so you must send an 8 bit read command 0hC1 or 0b11000001 and a 16 bit response will follow.

The datasheet states that it is a 3-wire SPI compatible device.  Input and output are accomplished over the same line SIO which is bidirectional for the MAX6662.

I have the following connections

MAX6662 PIN <----------Description---------->[BUS PIRATE]
1 <----------Sclk----------> [CLK from bus pirate]
2 <----------CS------------> [Chip Select from bus pirate]
3 <----------SIO-----------> [Both MOSI AND MISO pins from bus pirate]
4 <----------GND----------> [Ground from Bus Pirate]
5 <----------OT------------> [pull up to Vcc with 10k resistor]
6 <----------AL------------> [pull up to Vcc with 10k resistor]
7 <----------NC------------> [none]
8 <----------Vcc-----------> [3.3v from bus pirate]

My process for reading/writing from the bus pirate is as follows:

SPI Mode
Speed, 1Mhz
Clock Polarity, Idle Low
Output Clock Edge, Idle to Active
Input Sample Phase, Middle
CS, /CS
Output Type, Normal

when i query the bus pirate info screen, it shows the following:
Code: [Select]
[size=85]Bus Pirate v3.a                                                                                                    
Firmware v6.1 r1676  Bootloader v4.4                                                                             
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)                                                                       
http://dangerousprototypes.com                                                                                   
CFG1:0xFFDF CFG2:0xFF7F                                                                                           
*----------*                                                                                                     
Pinstates:                                                                                                       
1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)                                   
GND    3.3V    5.0V    ADC    VPU    AUX    CLK    MOSI    CS      MISO                                     
P      P      P      I      I      I      O      O      O      I                                         
GND    3.35V  4.98V  0.00V  0.00V  L      L      L      H      L                                         
POWER SUPPLIES ON, Pull-up resistors OFF, Normal outputs (H=3.3v, L=GND)                                         
MSB set: MOST sig bit first, Number of bits read/write: 8                                                         
a/A/@ controls AUX pin                                                                                           
SPI (spd ckp ske smp csl hiz)=( 4 0 0 0 1 0 )
[/size]
I then issue the read temperature register command and receive all zeros.
Code: [Select]
[size=85]SPI>[0b11000001r;16]                                                                                               
/CS ENABLED                                                                                                       
WRITE: 0b11000001                                                                                                 
READ: 0b00000000 0b00000000                                                                                       
/CS DISABLED                                                                                                     
SPI>[/size]
From the datasheet, my understanding is that a successful communication is as follows:

Exactly 24 clock cycles.  one bit per cycle. first 8 bits are commands.
cs is normally high, and the transaction begins when pullled low.
data gets clock in at rising edge of SCLK, 8 bits, one bit per cycle. 
If the read command is issued, the next 16 bits are outputs and the max starts driving at falling edge of eighth clock at one bit per cycle.
then chip select goes high completing transaction.

Does anyone have any advice on what i am doing wrong?
Can MOSI and MISO be shorted when trying to read a single bidirectional SIO line?
Is the read/write timing of my SPI transaction off? (i dont have an oscilliscope)

The Datasheet can be found here, if anybody is interested:
http://datasheets.maximintegrated.com/en/ds/MAX6662.pdf


Re: Max6662 Temp Sensor and Half-Duplex SPI

Reply #2
Does it work if you have the pullups enabled? (command 'P') Also connect the voltage the Vpu pin.

 

Re: Max6662 Temp Sensor and Half-Duplex SPI

Reply #3
Thanks SJAAK, this is very promising... there is some progress as outlined below, but still not fully functional.  i'm still a little stumped because when i issue a read command, i get back a 16 bit response(2 bytes) but it appears both bytes are the same, which shouldn't be the case...  i'm not clear why this is happening...


This setup didn't work, but i first tried Vpu connected to 3.3v, and pullups enabled. output is low, all 0:

Code: [Select]
SPI>m                                                                           
1. HiZ                                                                         
2. 1-WIRE                                                                     
3. UART                                                                       
4. I2C                                                                         
5. SPI                                                                         
6. 2WIRE                                                                       
7. 3WIRE                                                                       
8. LCD                                                                         
x. exit(without change)                                                       
                                                                               
(1)>5                                                                         
Set speed:                                                                     
 1. 30KHz                                                                     
 2. 125KHz                                                                     
 3. 250KHz                                                                     
 4. 1MHz                                                                       
                                                                               
(1)>4                                                                         
Clock polarity:                                                               
 1. Idle low *default                                                         
 2. Idle high                                                                 
                                                                               
(1)>1                                                                         
Output clock edge:                                                             
 1. Idle to active                                                             
 2. Active to idle *default                                                   
                                                                               
(2)>1                                                                         
Input sample phase:                                                           
 1. Middle *default                                                           
 2. End                                                                       
                                                                               
(1)>1                                                                         
CS:                                                                           
 1. CS                                                                         
 2. /CS *default                                                               
                                                                               
(2)>2                                                                         
Select output type:                                                           
 1. Open drain (H=Hi-Z, L=GND)                                                 
 2. Normal (H=3.3V, L=GND)                                                     
                                                                               
(1)>2                                                                         
Ready                                                                         
SPI>o                 
 1. HEX
 2. DEC
 3. BIN
 4. RAW

(1)>3
Display format set
SPI>W
POWER SUPPLIES ON
SPI>P
WARNING: pins not open drain (HiZ)
Pull-up resistors ON
SPI>i
Bus Pirate v3.a
Firmware v6.1 r1676  Bootloader v4.4
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
http://dangerousprototypes.com
CFG1:0xFFDF CFG2:0xFF7F
*----------*
Pinstates:
1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
GND    3.3V    5.0V    ADC    VPU    AUX    CLK    MOSI    CS      MISO
P      P      P      I      I      I      O      O      O      I
GND    3.24V  4.98V  0.00V  3.31V  L      L      L      H      L
POWER SUPPLIES ON, Pull-up resistors ON, Normal outputs (H=3.3v, L=GND)
MSB set: MOST sig bit first, Number of bits read/write: 16
a/A/@ controls AUX pin
SPI (spd ckp ske smp csl hiz)=( 4 0 0 0 1 0 )
*----------*
SPI>[0b11000001;8 r;16]
/CS ENABLED
WRITE: 0b11000001
READ: 0b00000000 0b00000000
/CS DISABLED
SPI>


This setup seems to be more promising:
When i connect the max6662 to 5v with Vpu at 5v as well and configure the bus pirate to use open drain, i get the following output:

Code: [Select]
SPI>m                                                                           
1. HiZ                                                                         
2. 1-WIRE                                                                     
3. UART                                                                       
4. I2C                                                                         
5. SPI                                                                         
6. 2WIRE                                                                       
7. 3WIRE                                                                       
8. LCD                                                                         
x. exit(without change)                                                       
                                                                               
(1)>5                                                                         
Set speed:                                                                     
 1. 30KHz                                                                     
 2. 125KHz                                                                     
 3. 250KHz                                                                     
 4. 1MHz                                                                       
                                                                               
(1)>4                                                                         
Clock polarity:                                                               
 1. Idle low *default                                                         
 2. Idle high                                                                 
                                                                               
(1)>1                                                                         
Output clock edge:                                                             
 1. Idle to active                                                             
 2. Active to idle *default                                                   
                                                                               
(2)>1                                                                         
Input sample phase:                                                           
 1. Middle *default                                                           
 2. End                                                                       
                                                                               
(1)>1                                                                         
CS:                                                                           
 1. CS                                                                         
 2. /CS *default                                                               
                                                                               
(2)>2                                                                         
Select output type:                                                           
 1. Open drain (H=Hi-Z, L=GND)                                                 
 2. Normal (H=3.3V, L=GND)                                                     
                                                                               
(1)>1                                                                         
Ready                                                                         
SPI>o                                                                         
 1. HEX                                                                       
 2. DEC                                                                       
 3. BIN                                                                       
 4. RAW                                                                       
                                                                               
(1)>3                                                                         
Display format set                                                             
SPI>W                                                                         
POWER SUPPLIES ON                                                             
SPI>P                                                                         
Pull-up resistors ON                                                           
SPI>i                                                                         
Bus Pirate v3.a                                                               
Firmware v6.1 r1676  Bootloader v4.4                                           
DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)                                     
http://dangerousprototypes.com                                                 
CFG1:0xFFDF CFG2:0xFF7F                                                       
*----------*                                                                   
Pinstates:                                                                     
1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
GND    3.3V    5.0V    ADC    VPU    AUX    CLK    MOSI    CS      MISO   
P      P      P      I      I      I      O      O      O      I     
GND    3.40V  4.98V  0.00V  4.98V  L      L      L      H      L     
POWER SUPPLIES ON, Pull-up resistors ON, Open drain outputs (H=Hi-Z, L=GND)   
MSB set: MOST sig bit first, Number of bits read/write: 16                     
a/A/@ controls AUX pin                                                         
SPI (spd ckp ske smp csl hiz)=( 4 0 0 0 1 1 )                                 
*----------*                                                                   

SPI>[0b11000001;8 r;16]                                                       
/CS ENABLED                                                                   
WRITE: 0b11000001                                                             
READ: 0b00001100 0b00001100                                                   
/CS DISABLED                                                                   

SPI>[0b11000011;8 r;16]                                                       
/CS ENABLED                                                                   
WRITE: 0b11000011                                                             
READ: 0b00000000 0b00000000                                                   
/CS DISABLED

This output is interesting...  the first command "[0b11000001;8 r;16]" returns a temperature corresponding to 24.0625c.  which is a few degrees off.  holding my finger to the chip raises the reading to 30.0000c, and vice versa... so i'm getting somewhere but not convinced

The second command "[0b11000011;8 r;16]" reads the settings configurations, which default to zero on reset.

I think we're getting somewhere...  i'll try writing data to the configuration registers and see if it stores it, and check if i'm able to read it:

Code: [Select]
SPI>[0b11000011;8 r;16]
/CS ENABLED
WRITE: 0b11000011
READ: 0b00000000 0b00000000
/CS DISABLED
SPI>[0b10000011;8 0b11111111;8 0b11111111;8]
/CS ENABLED
WRITE: 0b10000011
WRITE: 0b11111111
WRITE: 0b11111111
/CS DISABLED
SPI>[0b11000011;8 r;16]
/CS ENABLED
WRITE: 0b11000011
READ: 0b00011111 0b00011111
/CS DISABLED
SPI>


So this is odd...  after sending the 8bit read command, i expect to get back 16bits of data (2 bytes), but i'm expecting two different bytes. in all cases, for the two byte response i'm getting are the same the first and secont byte are exactly the same.  this should not be the case.

Any additonal assistance would be appreciated.  Thank you!