FTDI Community

Please login or register.

Login with username, password and session length.
Advanced Search  

News:

Welcome to the FTDI Community!

Please read our Welcome Note

Technical Support enquires
please contact the team
@ FTDI Support


New Bridgetek Community is now open

Please note that we have created the Bridgetek Community to discuss all Bridgetek products e.g. EVE, MCU.

Please follow this link and create a new user account to get started.

Bridgetek Community

Author Topic: LibMPSSE - unexpected behavior of SPI_ReadWrite function  (Read 957 times)

dania

  • Newbie
  • *
  • Posts: 11
    • View Profile
LibMPSSE - unexpected behavior of SPI_ReadWrite function
« on: March 07, 2022, 01:10:01 PM »

Hello,

Code: [Select]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* OS specific libraries */
#ifdef _WIN32
#include<windows.h>
#endif

/* Include D2XX header*/
#include "ftd2xx.h"

/* Include libMPSSE header */
#include "libMPSSE_spi.h"

uint8 wr_buffer[128];
uint8 rd_buffer[128];
uint32 preneseno = 0;

int main()
{
FT_HANDLE handle = NULL;
FT_STATUS status = FT_OK;
FT_DEVICE_LIST_INFO_NODE devList = {0};
ChannelConfig channelConf = {0};
uint32 channels = 0;
uint8 i = 0;

channelConf.ClockRate = 800000;
channelConf.LatencyTimer = 1;
channelConf.configOptions = 0x0020;
channelConf.Pin = 0xFEFBFEFB;

/* init library */
#ifdef _MSC_VER
Init_libMPSSE();
#endif
status = SPI_GetNumChannels(&channels);
if (status != FT_OK) {
printf("status != FT_OK");
return 0;
}
printf("Number of available SPI channels = %d\n",(int)channels);

if (channels > 0)
{
for (i = 0;i < channels;i++)
{
status = SPI_GetChannelInfo(i, &devList);
if (status != FT_OK) {
printf("status != FT_OK");
return 0;
}
if (strcmp("Mila 5000 B", devList.Description) == 0) {
//device is connected
status = SPI_OpenChannel(i, &handle);
if(status != FT_OK) {
printf("status != FT_OK");
return 0;
}
break;
}
}
}
if (handle == NULL) {
printf("not opened");
return 0;
}
status = SPI_InitChannel(handle, &channelConf);
if (status != FT_OK) {
printf("status != FT_OK");
return 0;
}

while (1)
{
//write nasledovane read
wr_buffer[0] = 0x90;
status = SPI_Write(handle, wr_buffer, 1, &preneseno, 0x02);
if (status != FT_OK) {
printf("status != FT_OK");
return 0;
}
status = SPI_Read(handle, rd_buffer, 1, &preneseno, 0x06);

//readwrite
wr_buffer[0] = 0x90;
wr_buffer[1] = 0xFF;
status = SPI_ReadWrite(handle, rd_buffer, wr_buffer, 2, &preneseno, 0x06);
}

return 0;
}


SPI_ReadWrite sends unexpected 0xCC, 0xCC and reads data from SPI slave correctly. Then, even on the second call, SPI_Write sends 0xCC. I think there is a problem in LibMPSSE. How fix it?

Logged

FTDI Community

  • Administrator
  • Hero Member
  • *****
  • Posts: 800
    • View Profile
Re: LibMPSSE - unexpected behavior of SPI_ReadWrite function
« Reply #1 on: March 08, 2022, 05:02:39 PM »

Hi,
What version of LibMPSSE are you using?  The latest version of libMPSSE is v0.6:
https://ftdichip.com/software-examples/mpsse-projects/libmpsse-spi-examples/

You could add debug commands to try and figure out where the delays are, Another option is not to use libMPSSE and use the d2xx drivers direct:

To use I2C/SPI as a master, see AN_135 - MPSSE Basics and our existing MPSSE Example projects:
https://ftdichip.com/wp-content/uploads/2020/08/AN_135_MPSSE_Basics.pdf
https://ftdichip.com/software-examples/mpsse-projects/

There are two options to use I2C/SPI modes with the MPSSE engine:
 
a.   Use LibMPSSE libraries. Example code is provided with the download.
b.   Use D2XX drivers direct.  AN_108 provides the necessary information
https://ftdichip.com/wp-content/uploads/2020/08/AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf

Regards
FTDI Community 

Logged

dania

  • Newbie
  • *
  • Posts: 11
    • View Profile
Re: LibMPSSE - unexpected behavior of SPI_ReadWrite function
« Reply #2 on: March 10, 2022, 08:42:42 AM »

Hi,
 I have LibMPSSE ver. 0.6. I created the simplest code possible to verify that the problem was in the LibMPSSE.dll library. This is a logical explanation for the fact that other functions work normally. In another forum one user alerted me to https://in.mathworks.com/matlabcentral/answers/518039-ftdi-libmpsse-0-6-spi_readwrite-weird-behaviour-loadlibrary-calllib.

The easiest way is to avoid using the SPI_ReadWrite function.

I suggest placing this information in the FAQ so that users don't have to grope like me.

Regards
Dania
Logged