SPI help
TC
Posts: 1,019
Hello all,
I am working on a project for a friend. He is making an art project that has 1000 cast concrete faces. He wants to have it when someone places there hand on a face, an audio file of that person will play. We are going to use Microchip's CAP1188 for detecting proximity oh a hand. The chip can communicate with SPI, I2C/SMBUS. I am going with SPI. That way all the chips can share the same "MOSI", "MISO", and "CLK" lines. And all I have to do is select the correct "CS" line.
But I am having trouble figuring out what I am doing wrong. I am just trying to read the Product ID ($50) to see if my code currently works. And it doesn't...
Could someone please tell me where I am going wrong? Please excuse the messy code, I have been trying to get this to work for 2 days now, and I have gotten to the point where I don't care about how clean it is.
Thanks
TC
I am working on a project for a friend. He is making an art project that has 1000 cast concrete faces. He wants to have it when someone places there hand on a face, an audio file of that person will play. We are going to use Microchip's CAP1188 for detecting proximity oh a hand. The chip can communicate with SPI, I2C/SMBUS. I am going with SPI. That way all the chips can share the same "MOSI", "MISO", and "CLK" lines. And all I have to do is select the correct "CS" line.
But I am having trouble figuring out what I am doing wrong. I am just trying to read the Product ID ($50) to see if my code currently works. And it doesn't...
Could someone please tell me where I am going wrong? Please excuse the messy code, I have been trying to get this to work for 2 days now, and I have gotten to the point where I don't care about how clean it is.
Thanks
TC
CON _clkmode = xtal1 + pll16x 'Standard clock mode * crystal frequency = 80 MHz _xinfreq = 5_000_000 CLK_FREQ = ((_clkmode - xtal1) >> 6) * _xinfreq MS_001 = CLK_FREQ / 1_000 US_001 = CLK_FREQ / 1_000_000 CON {*** PINS ***} {*** Audio output ***} Audio_Left = 0 Audio_Right = 1 {*** SD card ***} SD_CS = 16 SD_MOSI = 17 SD_CLK = 18 SD_MISO = 19 {*** CAP1188 I2C ***} Cap_SDA = 20 Cap_SCL = 22 {*** CAP1188 SPI ***} Cap_MISO = 20 Cap_MOSI = 21 Cap_CLK = 22 Cap_CS = 23 {*** CAP1188 MISC ***} Cap_IRQ = 24 Cap_reset = 25 {*** Prop ***} SCL = 28 SDA = 29 TX = 30 RX = 31 CON {*** CAP1188 I2S address ***} k_82 = %0101_1000 k_100 = %0101_0110 k_120 = %0101_0100 k_150 = %0101_0010 VDD = %0101_0000 {*** CAP1188 registers ***} Main_Control = $00 General = $02 Sensor_input = $03 LED_Status = $04 Noise_flag = $0A Input_1_Delta = $10 Input_2_Delta = $11 Input_3_Delta = $12 Input_4_Delta = $13 Input_5_Delta = $14 Input_6_Delta = $15 Input_7_Delta = $16 Input_8_Delta = $17 Sens_Control = $1F Config = $20 Input_Enable = $21 Input_Config_1 = $22 Input_Config_2 = $23 Ave_Samp_Config = $24 Cal_Activate = $26 Int_Enable = $27 Repeat_Enable = $28 Mulit_touch_Config = $2A Multi_touch_Pattern_config = $2B Mulit_touch_Pattern = $2D Recalibration_Config = $2F Input_1_Threshold = $30 Input_2_Threshold = $31 Input_3_Threshold = $32 Input_4_Threshold = $33 Input_5_Threshold = $34 Input_6_Threshold = $35 Input_7_Threshold = $36 Input_8_Threshold = $37 Input_Noise_Threshold = $38 {*** Standby Config Registers ***} Standby_Channel = $40 Standby_Config = $41 Standby_Sensitivity = $42 Standby_Threshold = $43 Config_2 = $44 {*** Base Count Registers ***} Input_1_Count = $50 Input_2_Count = $51 Input_3_Count = $52 Input_4_Count = $53 Input_5_Count = $54 Input_6_Count = $55 Input_7_Count = $56 Input_8_Count = $57 {*** LED Controls ***} LED_Output_Type = $71 Input_LED_Linking = $72 LED_Polarity = $73 LED_Output_Control = $74 LED_Linked_Trans_Control = $77 LED_Mirror_Control = $79 LED_Behavior_1 = $81 LED_Behavior_2 = $82 LED_Pulse_1_Period = $84 LED_Pulse_2_Period = $85 LED_Breathe_Period = $86 LED_Config = $88 LED_Pulse_1_Duty_Cycle = $90 LED_Pulse_2_Duty_Cycle = $91 LED_Breathe_Duty_Cycle = $92 LED_Direct_Duty_Cycle = $93 LED_Direct_Ramp_Rates = $94 LED_Off_Delay = $95 {*** Sensor Input Calibration ***} Sensor_1_cal = $B1 Sensor_2_cal = $B2 Sensor_3_cal = $B3 Sensor_4_cal = $B4 Sensor_5_cal = $B5 Sensor_6_cal = $B6 Sensor_7_cal = $B7 Sensor_8_cal = $B8 Sensor_cal_LSB_1 = $B9 Sensor_cal_LSB_2 = $BA {*** Identifacation ***} Product_ID = $FD Manufacturer_ID = $FE Revision = $FF VAR byte temp OBJ spi : "SPI_Asm" com : "FullDuplexSerial.spin" PUB init pause(1000) 'serial com setup com.Start(rx, tx, 0, 115200) 'SPI setup SPI.start(100,0) com.str(string("Setup done", 13)) pause(500) com.str(string("Read Product ID", 13)) reset_bus CS_enable(Cap_CS) temp := rd_byte(Product_ID) CS_disable(Cap_CS) com.hex(temp,2) com.str(string(13, 13, "Done")) repeat PUB rd_byte(addr) | value set_address(addr) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, $7F) value := SPI.SHIFTIN(Cap_MISO, Cap_CLK, SPI#LSBPRE, 8) result := value PUB wr_byte(addr, value) set_address(addr) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, $7E) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, value) PUB set_address(addr) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, $7D) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, addr) PUB CS_enable(device) dira[device] := 1 outa[device] := 0 PUB CS_disable(device) dira[device] := 0 outa[device] := 0 PUB reset_bus CS_enable(Cap_CS) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, $7A) SPI.SHIFTOUT(Cap_MOSI, Cap_CLK, SPI#LSBFIRST, 8, $7A) CS_disable(Cap_CS) pub pause(ms) | t '' Delay program in milliseconds if (ms < 1) ' delay must be > 0 return else t := cnt - 1792 ' sync with system counter repeat ms ' run delay waitcnt(t += MS_001)
Comments
I slowed down the code so I could see what is going on (using a quickstart board). The CS line goes from HIGH to LOW when it should. The CAP1188 is not sending anything out on the MISO line. That tells me, it is not happy about something. But I can't figure out why.
I use Tachyon Forth on the prop but the language doesn't matter, two days work is worth the investment in a simple logic analyser like THIS if you don't have one. I've gotten the worst documented, kinda SPI-ish and I2C-ish sensors to talk this way.
On the cheap you can use a Propeller loaded up with Tachyon's SPLAT logic analyzer as long as the SPI isn't too fast.
I will have to try MSBFIRST again. I thought I did that at one point, but I can't remember for sure.
Sorry about the vaug responses, I'm at work on my break, and I don't have a lot of time to make this sound correct.
I will try everything when I get home tonight.
1) I needed MSB, not LSB
2) I had my pins wrong. I was counting the quickstart pins wrong.
Because of the Propalyzer I could see things did not look right. This is why I like asking on here, it offers another set of eyes, minds, and experiences that I just dont have access to anywhere else.
Thank you again for everything.
TC