The CYW954907AEVAL1F EVK enables customers to evaluate and develop single-chip Wi-Fi applications using CYW54907 devices. The CYW954907AEVAL1F EVK uses WICED Studio IDE to develop and debug your CYW54907 projects. In this code example, I have interfaced Infineon's precision pressure sensor DPS310 to the 54907 evaluation board and measured the temperature and pressure values of the surroundings via I2C. The required pins of the sensor are --> VDD(Supply Voltage 3.3V for analog blocks), VDDIO (Digital Supply Voltage 3.3V for digital blocks and I/O interface), GND, SDI and SCK. The application is implemented in WICED STUDIO IDE. The provided code example for DPS310 can be used for various IOT applications such as indoor navigation, health and sports, outdoor navigation, weather station etc.
Let's get started with the sensor's introduction!
The Infineon's DPS310 is a miniaturized Digital Barometric Air Pressure Sensor with a high accuracy and a low current consumption, capable of measuring both pressure and temperature. The pressure sensor element is based on a capacitive sensing principle which guarantees high precision during temperature changes. The small package makes the DPS310 ideal for mobile applications and wearable devices.
The internal signal processor converts the output from the pressure and temperature sensor elements to 24 bit results. Each unit is individually calibrated, the calibration coefficients calculated during this process are stored in the calibration registers. The coefficients are used in the application to convert the measurement results to high accuracy pressure and temperature values. The result FIFO can store up to 32 measurement results, allowing for a reduced host processor polling rate. Sensor measurements and calibration coefficients are available through the serial I2C or SPI interface. The measurement status is indicated by status bits or interrupts on the SDO pin.
For more features information and typical applications, refer to the DPS310 datasheet attached.
Temperature and Pressure Measurement
Calculation of Compensated Values
1. Read the pressure calibration coefficients (c00, c10, c20, c30, c01, c11, and c21) from the Calibration Coefficient register. Note: The coefficients read from the coefficient register are 2's complement numbers.
2. Choose scaling factors kT (for temperature) and kP (for pressure) based on the chosen precision rate. The scaling factors are listed in datasheet.
3. Read the pressure and temperature result from the registers or FIFO. Note: The measurements read from the result registers (or FIFO) are 24 bit 2´s complement numbers. Depending on the chosen measurement rates, the temperature may not have been measured since the last pressure measurement.
4. Calculate scaled measurement results.
5. Calculate compensated measurement results.
Known Issues
There could be a problem with temperature measurement of the DPS310. If your DPS310 indicates a temperature around 60 °C although you expect around room temperature, e.g. 20 °C, you have to update some registers with the specified values as given in the "DPS310_correct_temp_error" function in my code example and this will then provide the correct temperature value. As per Infineon, this can occur because of a fuse bit issue in some of the sensor's silicon. The function allows us to work around the issue.
For more information on this, please visit this link --> https://www.infineon.com/cms/en/product/sensor/pressure-sensors/pressure-sensors-for-iot/dps310/
PFA the code example and the snapshots for the same. Feel free to drop in your queries in the Cypress Developer Community.
Cheers!
Show LessScope
This blog provides a guideline to add support ST-Link (ST Micro’s programming & debug hardware) in an existing WICED SDK framework.
Disclaimer
Consider this document as a guideline, which has not been extensively tested and the procedure mentioned below could differ for different versions of WICED Studio & ST-Link.
Introduction
ST-Link is the on-board programmer used to program the code in ST MCU, details of which can be found at ST website. WICED uses OpenOCD to download the programs to the target MCU (ST host MCU, CYW43907, PSoC 6). In most of the standard WICED EVBs, an FTDI chip (FT2232H) has been used to provide the USB-UART / USB-JTAG bridge functionality which is what has been the standard download procedure followed by the OpenOCD in WICED.
Brief Introduction about OpenOCD
Open On-Chip Debugger (OpenOCD) is a free open-source project that facilitates downloading, debugging by using a debug adapter like ST-Link, FT2232H etc. OpenOCD works either by using commands or by using configuration files. When configuration is done and a connection to the target is established, OpenOCD will start running as a daemon in the background. The OpenOCD directory file has a folder called “scripts”. In this folder, you will see "interface", "board", and "target" folders. These are pretty much the only folders you need.
For detailed understanding of OpenOCD procedure and syntax, one can find their documentation at http://openocd.org/doc/html/index.html
WICED Download and debug procedure:
In WICED, an OpenOCD command is put into the .gdbinit file by the makefile system during compilation.
Wiced Eclipse has an optional component "GDB Hardware Debugging" installed. This allows it to instruct GDB to access a "GDB remote protocol server" via TCP.
Hence when Eclipse starts a debug session, it starts GDB, which in turn causes the .gdbinit OpenOCD command to be executed. OpenOCD is a "GDB remote protocol server", and next, Eclipse instructs GDB to connect to it.
During the startup of OpenOCD, it uses various JTAG & ARM protocols to interrogate the target chip. Once this initial interrogation is done, OpenOCD receives requests over TCP from GDB and services those requests on the target chip as needed details about this remote GDB can be found at GDB documentation.
How to add support for ST-Link:
WICED Environment uses the makefiles, configuration files as located in 43xxx_Wi-Fi/tools/makefiles and 43xxx_Wi-Fi/tools/OpenOCD respectively to download the code to the target MCU. Some changes have been made in the makefiles responsible for the download process and rest of the modifications were done in the OpenOCD directory, details of which can be found in the attached. Please note that modifying the existing makefiles, OpenOCD directory to enable ST-Link support is a one-way approach; i.e, you can’t program the other WICED boards (using a FT2232H chip) normally without restoring both directories back to the one shipped with SDK. So, it’s always recommended to make a back-up of the directories before replacing them with the attached.
In the example implementation, a custom JTAG macro was defined in the platform makefile (platform.mk) in the following way.
Based on the custom JTAG macro, openocd binary (openocd-all-brcm-libftdi.exe), as located in 43xxx_Wi-Fi/tools/OpenOCD/Win32/openocd-all-brcm-libftdi.exe expects a <custom JTAG macro>.cfg file in the 43xxx_Wi-Fi/tools/OpenOCD directory as shown in the figure below.
In this case, the stm32f469discovery.cfg file was copied from 43xxx_Wi-Fi/tools/OpenOCD/scripts/board/stm32f469discovery.cfg directory to the 43xxx_Wi-Fi/tools/OpenOCD directory. This stm32f469discovery.cfg has all the necessary interface, transport, target, reset_config specified. For a created platform, customer needs to create their own .cfg file based on the JTAG macro chosen and place them in 43xxx_Wi-Fi/tools/OpenOCD directory. If the created .cfg file has some error, a good place to start the debug procedure would be the openocd log generated as part of the build system which can be found at 43xxx_Wi-Fi/build/openocd_log.txt.
Refer to the files attached to this blog. We suggest you do a ‘Diff’ of the existing WICED Studio files and the attached files to understand the changes.
Show LessBy default the LwIP standard debug prints are disabled to save memory and re-use the same for other parts of application threads. But in-case, you need to enable the standard debug prints in LwIP stack, which is done by LWIP_DEBUGF, you need to follow the steps mentioned below.
lwipopts for WICED SDK can be found in 43xxx_Wi-Fi/WICED/network/LwIP/WWD/FreeRTOS/lwipopts.h. If you are on a DEBUG build (specified by -debug in the make target), WICED_LWIP_DEBUG macro will be enabled, but the prints are still disabled by default.
A standard snip example is considered to demonstrate the how-to operation for a DEBUG build.
2. Switch the LWIP_DBG_TYPES_ON to LWIP_DBG_ON
3. To enable specific debug messages in LWIP, just set the specific define value for the *_DEBUG value to " LWIP_DBG_ON". A comprehensive list of debug defines that can be enabled usually found in the 43xxx_Wi-Fi/WICED/network/LwIP/ver2.0.3/src/include/lwip/opt.h file. You need to copy the defines for the debug messages you want to enable into the lwipopts.h file and enable them there. As an example, I have switched the following on in my lwipopts.h file
#define TCP_DEBUG LWIP_DBG_ON
#define ETHARP_DEBUG LWIP_DBG_ON
#define PBUF_DEBUG LWIP_DBG_ON
#define IP_DEBUG LWIP_DBG_ON
#define TCPIP_DEBUG LWIP_DBG_ON
#define DHCP_DEBUG LWIP_DBG_ON
#define UDP_DEBUG LWIP_DBG_ON
Attached is the modified lwipopts.h file and and the uart terminal print. Please note that enabling debug prints can add extra size (approximately 20 kB for the mentioned settings) to the code. It will also slow down performance of the LwIP code due to required run-time checks and output. It's is recommended to enable debug support only if there is no chance of attaching an external debugger to the target platform and step through the code.
Show LessScope:
This Blog Post provides a guide on configuring the virtual AP interface as a STA interface in an existing WICED SDK framework.
Disclaimer:
Consider this document as a guide line and this feature hasn’t been tested extensively via any testing process. The examples attached have been tried on the 43907 and the 54907 platform and the application works.
Introduction:
Any Cypress WLAN chip can be operated as a STA (client), an AP (softAP), an ethernet interface or a P2P interface based on what is supported in that chip. Now, the STA, AP and P2P are nothing but virtual interfaces which the software creates. Most of our WLAN chips have the capability of operating these interfaces simultaneously. Most common is the operation of the WICED_STA_INTERFACE and the WICED_AP_INTERFACE. An example of this implementation can be found at /43xxx_Wi-Fi/apps/snip/apsta. Now instead of using one of the virtual interfaces as an AP, both the interfaces can be configured to be used as clients as discussed below.
Use Case:
As an example, this can be used say for example when a TCP and a UDP clients are needed to run simultaneously on a WLAN chip whereas the servers are running on two different networks.
Implementation:
The credentials for the second STA need to be defined in the respective wifi_config_dct.h file as below.
#define CLIENT_AP_2_SSID "SSID_FOR_STA2"
#define CLIENT_AP_2_PASSPHRASE "PSK_FOR_STA2"
#define CLIENT_AP_2_SECURITY WICED_SECURITY_WPA2_AES_PSK
#define CLIENT_AP_2_BSS_TYPE WICED_BSS_TYPE_INFRASTRUCTURE
#define CLIENT_AP_2_CHANNEL 1
#define CLIENT_AP_2_BAND WICED_802_11_BAND_2_4GHZ
The WICED_AP_INTERFACE can be defined to function as a STA by un-commenting //#define WICED_USE_WIFI_TWO_STA_INTERFACE in wiced_defaults.h at /43xxx_Wi-Fi/include/
Once this is done, there are two ways of realizing the second STA.
The Easy Way:
Once the WICED_USE_WIFI_TWO_STA_INTERFACE is defined, all that needs to be done is connect the two clients from the application is as below.
wiced_network_up(WICED_STA_INTERFACE, wiced_network_config_t config, const wiced_ip_setting_t* ip_settings);
wiced_network_up(WICED_AP_INTERFACE, wiced_network_config_t config, const wiced_ip_setting_t* ip_settings);
The disadvantage of this is, if you go back to using the device in a single STA mode, the functionality of the application needs to be monitored to ensure that the device doesn’t throw errors during run time as these types of errors won’t be detected easily during compile time.
The Clean Way:
Here what can be done is the WICED_AP_INTERFACE can be defined as WICED_STA_2_INTERFACE as this would be much more comprehensible. There’s a small work around that needs to be done when doing this as WICED_AP_INTERFACE is intertwined in many places and this needs to be dealt with.
The changes to be done are as below
Change the wiced_interface_t enumeration in wiced_constants.h (/43xxx_Wi-Fi/include/) as
typedef enum
{
#ifndef WICED_USE_WIFI_TWO_STA_INTERFACE
WICED_STA_INTERFACE = WWD_STA_INTERFACE, /**< STA or Client Interface */
WICED_AP_INTERFACE = WWD_AP_INTERFACE, /**< softAP Interface */
WICED_P2P_INTERFACE = WWD_P2P_INTERFACE, /**< P2P Interface */
WICED_ETHERNET_INTERFACE = WWD_ETHERNET_INTERFACE, /**< Ethernet Interface */
WICED_INTERFACE_MAX, /** DO NOT USE - MUST BE AFTER ALL NORMAL INTERFACES - used for counting interfaces */
WICED_CONFIG_INTERFACE = WICED_AP_INTERFACE | (1 << 7), /**< config softAP Interface */
#else
WICED_STA_INTERFACE = WWD_STA_INTERFACE, /**< STA or Client Interface */
WICED_STA_2_INTERFACE = WWD_STA_2_INTERFACE, /**< second STA Interface */
WICED_P2P_INTERFACE = WWD_P2P_INTERFACE, /**< P2P Interface */
WICED_ETHERNET_INTERFACE = WWD_ETHERNET_INTERFACE, /**< Ethernet Interface */
WICED_INTERFACE_MAX,
WICED_CONFIG_INTERFACE = WWD_STA_2_INTERFACE | (1 << 7),
#endif
} wiced_interface_t;
Change the wwd_interface_t enumeration in wwd_constants.h (/43xxx_Wi-Fi/WICED/WWD/include/) as
typedef enum
{
#ifndef WICED_USE_WIFI_TWO_STA_INTERFACE
WWD_STA_INTERFACE = 0, /**< STA or Client Interface*/
WWD_AP_INTERFACE = 1, /**< softAP Interface*/
WWD_P2P_INTERFACE = 2, /**< P2P Interface*/
WWD_ETHERNET_INTERFACE = 3, /**< Ethernet Interface*/
WWD_INTERFACE_MAX, /** DO NOT USE - MUST BE LAST INTERFACE VALUE - used for counting interfaces */
WWD_INTERFACE_FORCE_32_BIT = 0x7fffffff /**< Exists only to force wwd_interface_t type to 32 bits */
#else
WWD_STA_INTERFACE = 0, /**< STA or Client Interface*/
WWD_STA_2_INTERFACE = 1, /**< second STA Interface*/
WWD_AP_INTERFACE = WWD_STA_2_INTERFACE,
WWD_P2P_INTERFACE = 2, /**< P2P Interface*/
WWD_ETHERNET_INTERFACE = 3, /**< Ethernet Interface*/
WWD_INTERFACE_MAX, /** DO NOT USE - MUST BE LAST INTERFACE VALUE - used for counting interfaces */
WWD_INTERFACE_FORCE_32_BIT = 0x7fffffff /**< Exists only to force wwd_interface_t type to 32 bits */
#endif
} wwd_interface_t;
And add the line #include "../../../include/wiced_defaults.h"
Add the following definition
#ifdef WICED_USE_WIFI_TWO_STA_INTERFACE
#define WICED_AP_INTERFACE WICED_STA_2_INTERFACE
#endif
in the files ,wifi.c (/43xxx_Wi-Fi/WICED/internal/), wiced_network_common.c(/43xxx_Wi-Fi/WICED/network/) ,wiced_network.c(/43xxx_Wi-Fi/WICED/network/NetX_Duo/WICED) [This will be depend on the network stack being used] and
command_console_wifi.c(/43xxx_Wi-Fi/libraries/utilities/command_console/wifi/)
Add the below lines in wwd_ap_common.c(/43xxx_Wi-Fi/WICED/WWD/internal/)
#ifdef WICED_USE_WIFI_TWO_STA_INTERFACE
#define WWD_AP_INTERFACE WWD_STA_2_INTERFACE
#endif
Once the changes are done, upload the application on to your board, run the tcp_echo_server_py3.py and the udp_echo_server_py3.py on the respective networks and you should get the logs as below.
The board may keep on resetting after joining the 2nd STA network when using FreeRTOS-LwIP combination. If this is encountered, please use the NetX or the NetX_Duo as the network stack
WICED currently has support for sflash from the following manufacturers.
You can get a list of all the supported sflash in CYW43907 with External SFLASH in WICED . If you want to add support for any other part number from the existing supported flash manufacturers in WICED SDK, you can follow the steps mentioned below. In this example, I have added support for N25Q128A flash from MICRON.
For ST based platforms:
#define SFLASH_ID_MX25L8006E ( (uint32_t) 0xC22014 )
#define SFLASH_ID_MX25L1606E ( (uint32_t) 0xC22015 )
#define SFLASH_ID_MX25L6433F ( (uint32_t) 0xC22017 )
#define SFLASH_ID_MX25L12835F ( (uint32_t) 0xC22018 )
#define SFLASH_ID_MX25L25635F ( (uint32_t) 0xC22019 )
#define SFLASH_ID_MX25U1635F ( (uint32_t) 0xC22535 )
#define SFLASH_ID_MX66U51235F ( (uint32_t) 0xC2253A )
#define SFLASH_ID_SST25VF080B ( (uint32_t) 0xBF258E )
#define SFLASH_ID_EN25QH16 ( (uint32_t) 0x1C3015 )
#define SFLASH_ID_ISSI25CQ032 ( (uint32_t) 0x7F9D46 )
#define SFLASH_ID_N25Q512A ( (uint32_t) 0x20BB20 )
#define SFLASH_ID_ISSI25LP064 ( (uint32_t) 0x9D6017 )
#define SFLASH_ID_N25Q064A ( (uint32_t) 0x20BA17 )
#define SFLASH_ID_W25Q64FV ( (uint32_t) 0xEF4017 )
#define SFLASH_ID_CY15B104Q ( (uint32_t) 0x7F7F7F )
+#define SFLASH_ID_N25Q128A ( (uint32_t) 0x20BA18 )
#define SFLASH_ID_DEFAULT ( (uint32_t) 0x000000 )
#define SFLASH_SIZE_1MByte 0x100000
#define SFLASH_SIZE_2MByte 0x200000
#define SLFASH_SIZE_32MByte 0x2000000
#define SFLASH_SIZE_64MByte 0x4000000
#define SFLASH_SIZE_512KByte 0x80000
#define SFLASH_SIZE_16MByte 0x1000000
device_id_to_flash_size_t sflash_device_id_size [SFLASH_ID_MAX_PARTS] =
{
{ SFLASH_ID_MX25L8006E, SFLASH_SIZE_1MByte },
{ SFLASH_ID_MX25L1606E, SFLASH_SIZE_2MByte },
{ SFLASH_ID_MX25L25635F, SLFASH_SIZE_32MByte },
{ SFLASH_ID_MX25U1635F, SFLASH_SIZE_2MByte },
{ SFLASH_ID_SST25VF080B, SFLASH_SIZE_1MByte },
{ SFLASH_ID_EN25QH16, SFLASH_SIZE_2MByte },
{ SFLASH_ID_N25Q512A, SFLASH_SIZE_64MByte },
{ SFLASH_ID_CY15B104Q, SFLASH_SIZE_512KByte },
{ SFLASH_ID_N25Q128A, SFLASH_SIZE_16MByte }
};
For 4390x based platform
To add a new part with the already supported sflash chips for 4390x platform, you have to make the necessary modifications in 43xxx_Wi-Fi/WICED/platform/MCU/BCM4390x/peripherals/spi_flash.
#define SFLASH_ID_MX25L8006E SFLASHID( 0xC2, 0x20, 0x14 )
#define SFLASH_ID_MX25L1606E SFLASHID( 0xC2, 0x20, 0x15 )
#define SFLASH_ID_MX25L6433F SFLASHID( 0xC2, 0x20, 0x17 )
#define SFLASH_ID_MX25L12835F SFLASHID( 0xC2, 0x20, 0x18 )
#define SFLASH_ID_MX25L25635F SFLASHID( 0xC2, 0x20, 0x19 )
#define SFLASH_ID_MX25U1635F SFLASHID( 0xC2, 0x25, 0x35 )
#define SFLASH_ID_MX66U51235F SFLASHID( 0xC2, 0x25, 0x3A )
#define SFLASH_ID_SST25VF080B SFLASHID( 0xBF, 0x25, 0x8E )
#define SFLASH_ID_EN25QH16 SFLASHID( 0x1C, 0x30, 0x15 )
#define SFLASH_ID_ISSI25CQ032 SFLASHID( 0x7F, 0x9D, 0x46 )
#define SFLASH_ID_N25Q512A SFLASHID( 0x20, 0xBB, 0x20 )
#define SFLASH_ID_ISSI25LP064 SFLASHID( 0x9D, 0x60, 0x17 )
#define SFLASH_ID_N25Q064A SFLASHID( 0x20, 0xBA, 0x17 )
#define SFLASH_ID_W25Q64FV SFLASHID( 0xEF, 0x40, 0x17 )
#define SFLASH_ID_S25FL064L SFLASHID( 0x01, 0x60, 0x17 )
#define SFLASH_ID_S25FL128L SFLASHID( 0x01, 0x60, 0x18 )
#define SFLASH_ID_S25FL256L SFLASHID( 0x01, 0x60, 0x19 )
#define SFLASH_ID_N25Q128A SFLASHID( 0x20, 0xBA, 0x18 )
#define SFLASH_ID_DEFAULT SFLASHID( 0x00, 0x00, 0x00 )
#ifdef SFLASH_SUPPORT_MICRON_PARTS
{ SFLASH_ID_N25Q064A, { 8*MBYTE, 256, .action = µn_action, .speed_advance = µn_speed_config } },
{ SFLASH_ID_N25Q128A, { 16*MBYTE, 256, .action = µn_action, .speed_advance = µn_speed_config } },
#endif
GLOBAL_DEFINES += SFLASH_SUPPORT_MICRON_PARTS
Debugging Notes:
SFLASH Device ID ( 0x20ba18)
SFLASH Size ( 0x1000000)
SUMMARY:
We have some snip ,test codes in SDK release, this blog is showing how to use snip.dct_read_write, snip.apsta, snip.GPIO to finish one application. And the function is to join different AP by pressing user button. It will help you to understand how to join AP , how to read/write DCT area, be familiar with rule of GPIO operation. Test is based on Wiced 6.2.1.2 release on CYW954907AEVAL1F EVB.
MAIN WORK:
you can type <status> to check the interface like below:
3. If you want to use command console ,really need big memory (2MB and above), and you need to enable it in makefile:
GLOBAL_DEFINES += INCLUDE_COMMAND_CONSOLE
If you want to use the DCT mac address, you need to enable it in makefile:
GLOBAL_DEFINES +=MAC_ADDRESS_SET_BY_HOST
Some other useful commands are showed here.
4. ADD user_1, user_2 GPIO test code into APSTA.
to find platform_gpio_buttons define in platform.c and platform.h
Below are some structure relationships in the code.
You will see real user_1, user_2 connections in the pdf circuit.
About user_1 and user_2 button initialization, these two pins are already set to INPUT_PULL_UP by default in the boot stage of the board,so you don’t need to initialize them again as a GPIO.
5. Add DCT read code into APSTA.
Below is the wifi config section printed:
6. Adding code to switch AP
And it is better to add some wwd_wlan_status judge before jumping into calling.
7. add all functions into apsta code:
The steps are:
Reference:
Snip.apsta
Snip.GPIO
Snip.dct_read_write
WICED Device Configuration Table (DCT) Users Guide
cyw954907aeval1f.pdf
Show LessWe divide the SDK code into different module or library for specific function, and Hierarchical software design also is useful for the code maintenance. This blog is to show the log setting for different module. Please see below architecture from SDK release document. Our aim is to print useful logs when issue happens, upload one module picture from SDK release .
https://fresh2refresh.com/c-programming/c-printf-and-scanf/
#include <stdio.h>
int main()
{
char ch = 'A';
char str[20] = "fresh2refresh.com";
float flt = 10.234;
int no = 150;
double dbl = 20.123456;
printf("Character is %c \n", ch);
printf("String is %s \n" , str);
printf("Float value is %f \n", flt);
printf("Integer value is %d\n" , no);
printf("Double value is %lf \n", dbl);
printf("Octal value is %o \n", no);
printf("Hexadecimal value is %x \n", no);
return 0;
}
· %d got replaced by value of an integer variable (no),
· %c got replaced by value of a character variable (ch),
· %f got replaced by value of a float variable (flt),
· %lf got replaced by value of a double variable (dbl),
· %s got replaced by value of a string variable (str),
· %o got replaced by a octal value corresponding to integer variable (no),
· %x got replaced by a hexadecimal value corresponding to integer variable
· \n got replaced by a newline.
2. In wwd_debug.h, wwd_debug.c , wiced_defaults.h
We defined Macros to control the log output for different MODULE.
Modules are Application, library, Webserver , Network, RTOS,
Security , WPS, Supplicant, Wiced , WWD(Wiced wi-fi Driver) .
We have good instructions and warnings for the log setting:
* ** WARNING for PRINTING **
* If printing is enabled, the stack of each thread that uses printing
* must be increased to at least 4 kBytes since the printf function uses
* a lot of memory (including dynamic memory)
/* Select which group of functions are allowed to print */
/* WPRINT_ENABLE_<MODULE>_ERROR - Enable print messages in the respective <MODULE> that are present
* as WPRINT_<MODULE>_ERROR.
* For instance, if WPRINT_ENABLE_WWD_ERROR is enabled, then trace messages that are under
* WPRINT_WWD_ERROR will be printed. This directive shall also result in an ASSERT if the target is built in DEBUG mode.
* WPRINT_ENABLE_<MODULE>_DEBUG - Enable print messages in the respective module that are present as
* WPRINT_<MODULE>_DEBUG.
* For instance, if WPRINT_ENABLE_WWD_DEBUG is enabled, then trace messages that are under
* WPRINT_WWD_DEBUG will be printed.
* WPRINT_ENABLE_<MODULE>_INFO - Enable print messages in the respective module that are present as
* WPRINT_<MODULE>_INFO.
* For instance, if WPRINT_ENABLE_WWD_INFO is enabled, then trace messages that are under
* WPRINT_WWD_INFO will be printed.
If you disable all the logs, there will have a compiled error, so please keep this one at least:
#define WPRINT_ENABLE_APP_INFO /* Application prints */
So general debug sequence for log enable:
I think if you want to manage the log clearly , you can define one MACRO to just add your debug info ,like #define WPRINT_ENABLE_BUG_DEBUG_INFO , after issue is fixed you can disable it .Another log print mode :
If you want to close the log , please change the log to WICED_LOG_OFF, the logs added in the application will be disabled. And strongly suggest to use this debug info in application debug stage.
Log initialize at application_start and enum structure.
wiced_log_init(WICED_LOG_INFO, render_log_output, wiced_time_get_time);
wiced_log_msg(WLF_DEF, WICED_LOG_NOTICE, "wiced logging system is initialized\n");
typedef enum
{
WICED_LOG_OFF = 0,
WICED_LOG_ERR,
WICED_LOG_WARNING,
WICED_LOG_NOTICE,
WICED_LOG_INFO,
WICED_LOG_DEBUG0,
WICED_LOG_DEBUG1,
WICED_LOG_DEBUG2,
WICED_LOG_DEBUG3,
WICED_LOG_DEBUG4,
WICED_LOG_PRINTF, /* Identifies log messages generated by wiced_log_printf calls */
WICED_LOG_MAX
} WICED_LOG_LEVEL_T;
b: How to write to STDOUT .
use this function:
Enable time output with log together.
Scope
The purpose of this document is to enable the WICED community to support a new MCU device using existing WICED Wi-Fi Driver (WWD) supported in WICED Studio. It allows user to use the MCU of their choice to achieve required system performance and cost goals. Though this document describes how to use a different MCU, Cypress community provides support only on the platforms/MCUs that are officially supported in WICED Studio. To learn more about the platforms/MCUs supported in WICED Studio, please refer to the WICED Studio Technical Brief. If you need support while porting to a different MCU, we recommend you to reach out to our partners.
This document covers the porting instructions with an example of Cypress’s Wi-Fi and Bluetooth combo device CYW4343W and ST MCU STM32F469. Example leverages STM32F469-DISCO board as it has an SD card interface that makes it easy to access SDIO lines.
Disclaimer
This document assumes that you have basic understanding of WICED Studio and WICED Software Stack. The following document is a set of instructions / guidelines, which could vary based on the MCU chosen. The resultant platform files have not gone through the standard validation or testing done on platforms which are part of standard WICED Studio release.
Modifications required in WICED Studio
Steps involved in supporting a new MCU update existing files available in WICED that are used for other MCUs/Platforms.
1. Creating your own platform directory
The platform folder “CYW94343WWCD3” is placed in 43xxx_Wi-Fi/platforms as shown in Figure 1.
Figure 1 Platform directory
It would contain the files necessary to access the host processor peripherals, their configuration, Wi-Fi NVRAM settings, platform makefile.
a. platform.h: Declaration of GPIOs, LEDs, peripherals and corresponding IRQs are provided here. It is a good practice to first create a platform pin definitions table in platform.h. This table would map the WICED pin name to the exact pin name of the STM32 host processor. It is basically provided in commented form. For instance, the WICED pin name WICED_GPIO_1 is mapped to STM32 port pin G10 as shown in Figure 2.
Figure 2 Platform pin definitions
This will help us determine the total number of WICED pins which in turn would help us to define the enum wiced_gpio_t. This enum basically contains the list of WICED pin names which would be mapped to STM32 port pins in platform.c. Likewise peripheral pins such as SPI, I2C, UART are defined using the enums wiced_spi_t, wiced_i2c_t, wiced_uart_t. The total pins to be defined must be known before defining an enum.
To allow UART terminal printing, we would need to assign the STDIO_UART used for UART standard I/O to the appropriate WICED UART pin defined above.
b. platform.c: source file describing the GPIO organization which includes the Wi-Fi control pins, strapping options, essential peripherals like debug UART initialization. Customer also needs to be careful about defining the structures specific to their peripheral requirement. They can refer to the expected structure format in existing WICED supported platforms; e.g for STM32F4xx host MCU: 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/peripherals/platform_mcu_peripheral.h. This structure format is also dependent on the host MCU and peripheral choice.
This is where we define the mapping of WICED pin names to the corresponding STM32 port pins as shown in Figure 3.
Figure 3 GPIO pin table
Similarly, the Wi-Fi control pins and Wi-Fi SDIO pins are as shown in Figure 4
Figure 4 Wi-Fi control pins and SDIO pins
It is important to note that the WWD enums shown above have already been defined in the WWD driver and they are used during Wi-Fi initialization.
Next the WICED peripheral structure would need to be defined so that it captures all the information required for its initialization and subsequent operation. This would typically include the WICED pin names defined earlier, peripheral driver constants, register flags. The peripheral driver library is specific to a host processor, in this case, it is available in stm32f4xx.h. For instance, a typical UART peripheral is defined in Figure 5 for STM32F4XX.
Figure 5 UART peripheral configuration
As shown above, the WICED pin name WICED_UART_1 is defined above. The UART tx and rx pins have been mapped to the appropriate WICED GPIO pins defined earlier. The UART port is mapped to USART3 which is defined in stm32f4xx.h as a register address. The DMA configuration shown above was found from the TRM of STM32F469.
The hardware connections should be strictly made as per the mapping defined above.
The external devices such as LED, buttons, STDIO UART need to be initialized using the function platform_init_external_devices(). This function is called during MCU initialization.
The interrupt handler for a peripheral is defined using WWD_RTOS_DEFINE_ISR() and mapped to ISR using WWD_RTOS_MAP_ISR().
c. wifi_nvram_image.h: This is the nvram file for the WLAN module. This is supplied by the module partner. Since we are using the same Murata module used in NEB1DX_01platform, the nvram file can be interchangeably used.
d. platform_config.h: Clock configuration for the host MCU is provided here. For the host processor, the CPU clock frequency (CPU_CLOCK_HZ), crystal source (HSE_SOURCE), system clock divider constants (AHB_CLOCK_DIVIDER, APB1_CLOCK_DIVIDER, APB2_CLOCK_DIVIDER), PLL constants (PLL_SOURCE, PLL_M_CONSTANT, PLL_N_CONSTANT, PLL_P_CONSTANT, PLL_Q_CONSTANT, PLL_R_CONSTANT), system clock source (SYSTEM_CLOCK_SOURCE), systick clock source (SYSTICK_CLOCK_SOURCE), internal flash constants (INT_FLASH_WAIT_STATE, PLATFORM_STM32_VOLTAGE_2V7_TO_3V6), watchdog (DBG_WATCHDOG_TIMEOUT_MULTIPLIER) are used for configuring the host STM32F469. For the STM32F469 MCU, STM32CubeMX (https://www.st.com/en/development-tools/stm32cubemx.htmlSTM32CubeMX - STM32Cube initialization code generator - STMicroelectronics ) software was used. Using the STM32CubeMX tool, customers can select the target host MCU and the peripherals required for their use-case. The interactive tool also provides the option to correctly configure the clock based on the clock configuration in STM32CubeMX. The macros for Wi-Fi options WICED_WIFI_USE_GPIO_FOR_BOOTSTRAP_1, WICED_WIFI_OOB_IRQ_GPIO_PIN, WICED_USE_WIFI_POWER_PIN, WICED_USE_WIFI_32K_CLOCK_MCO and WICED_USE_WIFI_POWER_PIN_ACTIVE_HIGH need to be correctly defined as they would be used during WICED initialization. Please make sure to remove or comment out USES_RESOURCE_FILESYSTEM macro as we are putting all the resources in internal flash.
e. <platform_name>.mk: This is the platform makefile which contains information on the WLAN chip and host processor as well as Wi-Fi bus interface used which is SDIO for this module. Since the internal flash is enough to accommodate both Wi-Fi FW and clm blob, we have treated the memory resources as DIRECT RESOURCES (RESOURCES_LOCATION?= RESOURCES_IN_DIRECT_RESOURCES) which will build the WLAN FW and CLM blob along with the main application and put it in internal flash. The HSE_VALUE is the external crystal frequency used for clocking the host processor which is 8 MHz.
Creating these platform files require thorough knowledge of the host MCU. It is strongly advised to go through the datasheet and Technical Reference Manual (TRM) of the host MCU first.
We have interfaced the STM32F469 MCU to the Murata Type1DX through SDIO interface for which platform files should provide the correct pin mapping. To ease up the debugging, one UART port was used for which the DMA configuration, correct clock configuration, crystal selection, PLL settings need to be taken care of in platform files.
Essential points:
a. Wi-Fi control pins: These pins are used during initialization of WICED (43xxx_Wi-Fi/WICED/platform/MCU/wwd_platform_separate_mcu.c); hence the created platform file(s) should mention these pins.
b. Wi-Fi SDIO bus pins: For 4-bit SDIO transfer, data transfer lines (D0-D3), SDIO_CMD, SDIO_CLK along with the provision for OOB_IRQ should be provided in the platform definition. (43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/WWD/wwd_SDIO.c).
Points to Check:
If the UART port is not working as expected, check the HW pins, PLL settings, crystal selection made in platform.config.h. To understand the clock organization better, the user can check-out 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/peripherals/libraries/system_stm32f4xx.c.
2. Creating the Memory map
The memory map for the host MCU can be generally found in 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/GCC as shown in Figure 6.
Figure 6 Memory map STM32F469
The user can create their own linker-script based on the memory organization of the host MCU. (STM32CubeMx software can be used to check the memory organization, but proper modification to the linker script is up-to user’s competence).
3. Modifying the common platform structure
The user must add the number of UART ports, number of SPI ports (if used) etc. for the target platform in 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/peripherals/platform_mcu_peripheral.h.
The number of flash sectors for the host MCU need to be specified separately as well in 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/WAF directory. The macro PLATFORM_APP_END_SECTOR needs to be defined because it would be used during the process of loading a new program and DCT into internal flash. For STM32F469, the macro was defined as per the information specified in the TRM.
As the source files for STM32F4xx series is already present in WICED Studio, we have enabled the platform_name macro (STM32F469_479xx) in 43xxx_Wi-Fi/WICED/platform/MCU/STM32F4xx/peripherals/libraries/stm32f4xx.h.
TP1: At this point, the compilation with WICED build system should pass for the created platform. The build statement should be snip.<test_basic>-<platform_name>
4. Adding the SDIO interface
If the compilation is successful, you can build and download scan application using snip.scan-CYW94343WWCD3 download run. We did not use download_apps in the build statement because we have placed our resources including WLAN firmware and CLM blob in internal flash memory. If you have used ST-Link, you can refer to the post Adding ST-Link support in WICED to enable ST-Link support in WICED. After the programming is successful, you can check the UART terminal output. If the terminal does not print the WLAN MAC address, WLAN firmware and WLAN CLM details, it means that WLAN interface was not initialised. A typical scenario is as shown in Figure 7.
Figure 7 WLAN interface not working
Check where the execution is getting stuck. You can enable the macro WPRINT_ENABLE_WWD_DEBUG to enable WWD debug prints. If SDIO bus does not initialize (check comment in WWD), make sure WL_REG_ON pin on the Murata module is connected to the pin defined by the index WWD_PIN_POWER in platform.c. Check SDIO clock control register for further debugging. Use SLOW_SDIO_CLK and SDIO_1_BIT in <platform_name>.mk file.
If it is stuck at waiting on HT clock, the LPO has not been configured correctly. The LPO_IN pin needs to be connected to external source defined by the index WWD_PIN_32K_CLK defined in platform.c.
If you are getting stuck in F2, FIFO underflow could be a probable cause. Check the SDIO_STA (interrupt status) register to debug the issue. You can check wwd_sdio.c and wwd_bus_protocol.c. You can consider disabling the interrupt received flag SDIO_MASK_SDIOITIE from the SDIO mask register in STM32F4xx/WWD/wwd_sdio.c. In that case, the function wwd_bus_packet_available_to_read() would have to be commented out because this function would check for interrupt by reading the IntStatus register of the WLAN chip.
The patch file “WWD_changes.patch” contains the specific changes made to WWD driver discussed above which can be applied.
a. Debugging and testing the SDIO interface
The WWD contains debug prints to indicate error or failure in function execution inside WWD. To enable WWD debugging, go to wiced_defaults.h and enable the following macros:
#define WPRINT_ENABLE_WWD_INFO /* Wiced Wi-Fi Driver prints */
#define WPRINT_ENABLE_WWD_DEBUG
#define WPRINT_ENABLE_WWD_ERROR
Whenever the host processor needs to initialize or access the WLAN interface, it uses the SDIO interface and SDIO packets are transmitted/received across the interface. It is possible to evaluate the WWD and SDIO bus TX/RX statistics at any WWD function call to understand if there were any issues in the WWD and SDIO bus transactions. It basically provides us two types of statistics:
WWD Stats: This is encapsulated in the structure wwd_stats_t and it captures the TX/RX stats at WWD driver.
typedef struct
{
uint32_t tx_total; /* Total number of TX packets sent from WWD */
uint32_t rx_total; /* Total number of RX packets received at WWD */
uint32_t tx_no_mem; /* Number of times WWD could not send due to no buffer */
uint32_t rx_no_mem; /* Number of times WWD could not receive due to no buffer */
uint32_t tx_fail; /* Number of times TX packet failed */
uint32_t no_credit; /* Number of times WWD could not send due to no credit */
uint32_t flow_control; /* Number of times WWD Flow control is enabled */
} wwd_stats_t;
Bus stats: This is encapsulated in the structure wwd_bus_stats_t and it contains information on SDIO TX/RX packet stats at the interface.
typedef struct
{
uint32_t cmd52; /* Number of cmd52 reads/writes issued */
uint32_t cmd53_read; /* Number of cmd53 reads */
uint32_t cmd53_write; /* Number of cmd53 writes */
uint32_t cmd52_fail; /* Number of cmd52 read/write fails */
uint32_t cmd53_read_fail; /* Number of cmd53 read fails */
uint32_t cmd53_write_fail; /* Number of cmd53 write fails */
uint32_t oob_intrs; /* Number of OOB interrupts generated by wlan chip */
uint32_t sdio_intrs; /* Number of SDIO interrupts generated by wlan chip */
uint32_t error_intrs; /* Number of SDIO error interrupts generated by wlan chip */
uint32_t read_aborts; /* Number of times read aborts are called */
} wwd_bus_stats_t;
The function wwd_print_stats ( wiced_bool_t reset_after_print ) evaluates the WWD packet stats and SDIO bus stats at the interface. To enable this function, enable the macro WWD_ENABLE_STATS in wiced_defaults.h. As an example, the wwd_print_stats(WICED_FALSE) is called inside SDIO/wwd_bus_protocol.c after WLAN firmware download wwd_bus_sdio_download_firmware( ) and before waiting for F2 to be ready.
Figure 8 Testing WWD stats
The results are shown below:
Working interface
WWD Stats..
tx_total:0, rx_total:0, tx_no_mem:0, rx_no_mem:0
tx_fail:0, no_credit:0, flow_control:0
Bus Stats..
cmd52:151, cmd53_read:0, cmd53_write:29
cmd52_fail:0, cmd53_read_fail:0, cmd53_write_fail:0
oob_intrs:0, sdio_intrs:151, error_intrs:0, read_aborts:0
Non-working interface
WWD Stats..
tx_total:0, rx_total:0, tx_no_mem:0, rx_no_mem:0
tx_fail:0, no_credit:0, flow_control:0
Bus Stats..
cmd52:151, cmd53_read:0, cmd53_write:29
cmd52_fail:0, cmd53_read_fail:0, cmd53_write_fail:0
oob_intrs:0, sdio_intrs:30, error_intrs:0, read_aborts:0
We can see that in a non-working interface, the number of sdio_intrs is far less than those in a working interface. So basically, the WWD packet stats would help us in characterizing the SDIO interface.
b. Testing i-perf statistics
To test the network performance of the added platform, a basic i-perf throughput test was done in normal environment between the WICED platform and a WIN 10 PC. The WIN 10 PC was set up as TCP server and the test.iperf_app was used to set up a TCP client in the WICED side (WICED board TX and PC is the RX here).
PC Side:
Run the command prompt in the i-perf directory and use the following command
iperf -s -w 655k
WICED Setup:
Build and download the test.iperf_app with the following packet pools settings in the iperf_app.mk
GLOBAL_DEFINES := TX_PACKET_POOL_SIZE=200 RX_PACKET_POOL_SIZE=200
GLOBAL_DEFINES += PBUF_POOL_TX_SIZE=100 PBUF_POOL_RX_SIZE=100
GLOBAL_DEFINES := WICED_TCP_WINDOW_SIZE=65535
iperf -c <ip_address of server> -w 655k
The throughput number we achieved for TCP client-server architecture is 5.66 Mbits/sec as shown in Figure 9.
Figure 9 I-Perf throughput
The help article for iperf set-up in WICED platform can be found at 43xxx_Wi-Fi/apps/test/iperf_app/README-Iperf.pdf.
General bringup issues
HT Avail Timeout
Throughput Issues
We have different options in the command input line for setting a global define. Below topic is a simple explanation for these inputs.
Actually you can also get most of them from the makefile. We also provide examples after wiced studio installed.
Build for release
Keyword:debug,
It means if you want to use Jtag or Jlink to have a debug, you need to add this option to get a debug image.
Keyword : FreeRTOS-LwIP download run
It means use FreeRTOS system, LwIP network protocol and use the default USB-JTAG programming interface.
Keyword:download_apps
If you want to download app into external flash by using SFLASH_WRITER_APP, you need to enable this option.
Keyword: FreeRTOS-LwIP-SDIO
It means using FreeRTOS system, LwIP network protocol, SDIO interface for communication.
Keyword: ThreadX-NetX_Duo-SDIO
It means using Threadx OS system, Netx network protocol, SDIO interface communication.
Keyword: ThreadX-NetX-SPI
It means using Threadx OS system, Netx network protocol, SPI communication interface.
Keyword: VERBOSE=1
It means compile and download log will output with a more detailed logs.
we also have some other options like [JTAG=xxx] [no_dct] [JOBS=x] , below comments are important for input compile options:
Notes
* Component names are case sensitive
* 'WICED', 'SDIO', 'SPI' and 'debug' are reserved component names
* Component names MUST NOT include space or '-' characters
* Building for release is assumed unless '-debug' is appended to the target
* Some platforms may only support a single interface bus option
Below are instructions for OTA2, please refer to the document carefully .
Key words are:
//Build an OTA2 Update Image suitable for upgrade server:
ota2_image
ota2_download
//Build an OTA2 Factory Reset Image suitable for manufacturing FLASHing of the device:
ota2_factory_image
ota2_factory_download
//It includes waf/ota2_bootloader, OTA2_factory_reset_image.bin, waf/ota2_failsafe, DCT, Application LUT, ota2_extract, and the application
ota2_manuf_image
ota2_manuf_download
// Below is for secure flash and version management.
APP_VERSION_FOR_OTA2_MAJOR=1
APP_VERSION_FOR_OTA2_MINOR=3
SECURE_SFLASH=1
keys=<keys_dir>
//show update from version of the SDK.
UPDATE_FROM_SDK=<bootloader_sdk>
//There were optional structures in the System DCT that are now always included. They are the Bluetooth (BT), Peer to Peer (P2P) and Over The Air 2 (OTA2) sub-structures. This information must also be designated so that the code knows which (if any) of the optional structures were used in the original application build DCT.
APP_USED_BT=1
APP_USED_P2P=1
APP_USED_OTA2=1
reference:
WICED Over The Air (OTA) v2 Firmware update Users Guide
Show LessSUMMARY:
We shared four ways to set wifi mac address, this blog is to show the process .
Test is based on CYW954907AEVAL1F .
Modify the address in the directory , it works.
#define NVRAM_GENERATED_MAC_ADDRESS "macaddr=00:A0:50:38:f6:35"
#define DCT_GENERATED_MAC_ADDRESS "\x00\xA0\x50\xe8\xf3\x48"
#define DCT_GENERATED_ETHERNET_MAC_ADDRESS "\x00\xA0\x50\xe5\xf3\x47"
Starting WICED vWiced_006.002.001.0002
Platform CYW954907AEVAL1F initialised
Started ThreadX v5.8
Initialising NetX_Duo v5.10_sp3
Creating Packet pools
WLAN MAC Address : B8:D7:AF:4D:1D:D6
WLAN Firmware : wl0: May 15 2018 19:39:17 version 7.15.168.114 (r689934) FWID 01-d6f88905
WLAN CLM : API: 12.2 Data: 9.10.74 Compiler: 1.31.3 ClmImport: 1.36.3 Creation: 2018-05-15 19:33:15
Have a test with mfg mode:
test.mfg_test-CYW954907AEVAL1F download download_apps run
static const char wifi_nvram_image[] =
"sromrev=11" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43d0" "\x00"
"macaddr=00:A0:50:38:f6:35" "\x00"
I do not find anywhere to fix the MAC address into nvram setting, so I presume OTP priority is higher than NVRAM, if OTP existed the NVRAM mac address will be ignored .
4. bcm4390x_platform.c
wwd_result_t host_platform_get_mac_address( wiced_mac_t* mac )
{
#ifndef WICED_DISABLE_BOOTLOADER
wiced_mac_t* temp_mac;
wiced_result_t result;
result = wiced_dct_read_lock( (void**)&temp_mac, WICED_FALSE, DCT_WIFI_CONFIG_SECTION, OFFSETOF(platform_dct_wifi_config_t, mac_address), sizeof(mac->octet) );
if ( result != WICED_SUCCESS )
{
return (wwd_result_t) result;
}
memcpy( mac->octet, temp_mac, sizeof(mac->octet) );
mac->octet[0]= 0x00;
mac->octet[1]= 0x11;
mac->octet[2]= 0x22;
mac->octet[3]= 0x33;
mac->octet[4]= 0x44;
mac->octet[5]= 0x55;
wiced_dct_read_unlock( temp_mac, WICED_FALSE );
#else
UNUSED_PARAMETER( mac );
#endif
return WWD_SUCCESS;
}
Starting WICED vWiced_006.002.001.0002
Platform CYW954907AEVAL1F initialised
Started ThreadX v5.8
Initialising NetX_Duo v5.10_sp3
Creating Packet pools
WLAN MAC Address : 00:11:22:33:44:55
WLAN Firmware : wl0: May 15 2018 19:39:17 version 7.15.168.114 (r689934) FWID 01-d6f88905
WLAN CLM : API: 12.2 Data: 9.10.74 Compiler: 1.31.3 ClmImport: 1.36.3 Creation: 2018-05-15 19:33:15
Console app
Show Less