How to connect Raspberry Pi to ADC MCP 3008 using new SPI Simulink blocks?

조회 수: 17 (최근 30일)
I want to interface a RaspberryPi with an ADC MCP3008 using Simulink, in particular using the new block "SPI Register Read" available in the latest Simulink version (without writing C code or Matlab code). In this block is required a Register Address where SPI has to read the value from the slave. I don't know how to find it because I'm not sure if it's a MCP3008 register or it's an address always used from RPi to communicate with all the slaves. Can anyone help me?
  댓글 수: 2
Bruder muss los
Bruder muss los 2022년 8월 10일
Hi Pietro, as far as I understand it, the MCP3008 has no registers in that sense, so you can't use the "register read"-block for this particular chip.
Instead, as Sharan proposed, I used the "master transfer"-block and took a few more nights to figure out the rest of the required logic. Since the "master transfer"-block gives you three output Bytes separately, but in one signal path, you have to dearrange the Bytes (via "selector"-blocks) and add the significant Bytes to get the desired 10-Bit value from the SPI Bus.
I hope this arrangement does the trick for you, too.
Raspberry Pi Simulink MCP3008 SPI Bus
Madhura Pabudanan
Madhura Pabudanan 2023년 7월 19일
I got the data from MCP 3008 from this method. I have an issue with the sample rate. I can not achive maximum sample rate from this method. How I overcome this problem ?

댓글을 달려면 로그인하십시오.

채택된 답변

Sharan Paramasivam Murugesan
Sharan Paramasivam Murugesan 2017년 8월 21일
SPI Register read/write blocks are meant for memory devices such as EEPROM.
So in your case, following the example,
try using "SPI Master Transfer" block with a constant block having value [1, bin2dec('10000000'), 0] as input. Here in the binary value '10000000', the first 4 bits '1000' represents single-ended voltage measurement at CH0 is requested (refer to the datasheet for more info). To read from CH1, then '1001' should be used. To retrieve the voltage value from the output, say 'data', you have to model the logic mentioned in the above doc (also mentioned below) using Simulink blocks.
highbits = bitand(data(2), bin2dec('11'));
voltage = double(bitor(bitshift(highbits, 8), data(3)));
voltage = (3.3/1024) * voltage;
  댓글 수: 1
Grissa Mohamed Amine
Grissa Mohamed Amine 2018년 1월 6일
i did the same thing with mcp3208 and i customize the code but it does not work, do you have another Solution please ?

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Bikash Sah
Bikash Sah 2018년 7월 10일
Hai Sharan, can you please explain the use of a constant block having value [1, bin2dec('10000000'), 0] as input to SPI Master Transfer. You wrote about the first four numeric values to control bits; what about the other four? What does the value "1" and "0" corresponds to. Also, a better explanation to understand the following code would be a great help.
clear mcp3008
mcp3008 = spidev(rpi, 'CE0');
data = uint16(writeRead(mcp3008,[1, bin2dec('10000000'), 0]));
highbits = bitand(data(2), bin2dec('11'));
voltage = double(bitor(bitshift(highbits, 8), data(3)));
voltage = (3.3/1024) * voltage;

Johannes Börner
Johannes Börner 2018년 7월 31일
Hi, Im currently trying to read the data of an MCP3008 in the way described above. Though I can manage the readings from command line, I have no indication that the SPI Master Transfer is working in any way when running the model. Is there any Simulink example using this block? Did anyone recently manage to get readings from an MCP3008?
Kind regards
  댓글 수: 1
Kiyo Akabori
Kiyo Akabori 2019년 11월 7일
For me, placing a Data Type Conversion block of uint8 between the constant block of [1, bin2dec('10000000'), 0] and SPI Master Transfer block did the trick. Without the conversion block, an array of type double was fed to the SPI master block, which ended up outputing values very close to zero (about 1e-300).

댓글을 달려면 로그인하십시오.


Abdo Be
Abdo Be 2019년 6월 18일
Hi, After multiple trials to read data from MCP3008 using SPI read block, it finally works for the first analog input (CH0),
However, in order to read analog input from the other channels (CH1,..CH7), normally the SPI write block should be driven by a constant block, I want to know the source of this synthax "[1, bin2dec('10000000'), 0]" that Sharan Paramasivam Murugesan mentionned above, because when I tested this block it doesn't change the analog input.
  댓글 수: 7
Bruder muss los
Bruder muss los 2022년 8월 10일
편집: Bruder muss los 2022년 8월 10일
Hey folks, as far as I understand it, the MCP3008 has no registers in that sense, so you can't use the "register read"-block for this particular chip.
Instead, as Sharan proposed, I used the "master transfer"-block and took a few more nights to figure out the rest of the required logic. Since the "master transfer"-block gives you three output Bytes separately, but in one signal path, you have to dearrange the Bytes (via "selector"-blocks) and add the significant Bytes to get the desired 10-Bit value from the SPI Bus.
I hope this arrangement does the trick for you, too.
Raspberry Pi Simulink MCP3008 SPI Bus
Madhura Pabudanan
Madhura Pabudanan 2023년 7월 20일
I got the data from MCP 3008 from this method. I have an issue with the sample rate. I can not achive maximum sample rate from this method. How I overcome this problem ?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Run on Target Hardware에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by