SAI module in Zephyr with FRDM-MCXN947

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

SAI module in Zephyr with FRDM-MCXN947

跳至解决方案
602 次查看
raimbowgeddon
Contributor I

Hello everybody,

I recently bought the MCXN947 evaluation board for my company's project as it seemed a very suitable soc for our needs, and for its native support for Zephyr, our rtos of choice.

Im having troubles setting up I2S communications over SAI module to retrieve data from a mems microphone, this code already worked for another soc albeit of another semiconductor company.

From my understanding, the board out of the box has all R0s set correctly for having SAI1 signals mapped on the available pins, they only clash with the LPSPI6 pins, and as the .dtsi file suggests (frdm_mcxn947_mcxn947_cpu0.dtsi) i disabled the flexcomm6 node. The i left the .pinctrl invaried, and connected Word Select (FS) to PT3_19 and Bit clock (BCLK) to PT3_18 and finally Data line (D0) to PT3_21. With an oscilloscope, i can confirm that no signal is seen on the FS and BTCLK line after an issued I2S_TRIGGER_START with the i2s_trigger function

here follows the main.c:

#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include "math.h"

#include <zephyr/device.h>
#include <zephyr/drivers/i2s.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(Main);

/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS   1000

/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)

/*
 * A build error on this line means your board is unsupported.
 * See the sample documentation for information on how to fix this.
 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

static const struct device* i2s_dev = DEVICE_DT_GET(DT_ALIAS(i2srx));

#define SAMPLE_RATE_HZ 48000
#define WORD_BITS 32
#define WORD_BYTES  4
#define CHANNELS 1
#define FRAME_BYTES (CHANNELS * WORD_BYTES)
#define I2S_RX_DURATION_MS 10
#define MEM_BLOCK_SIZE (SAMPLE_RATE_HZ * (CHANNELS * 0.001 * I2S_RX_DURATION_MS))
#define MEM_BLOCK_BYTESIZE (MEM_BLOCK_SIZE * WORD_BYTES)

K_MEM_SLAB_DEFINE(slab, (size_t)MEM_BLOCK_BYTESIZE, 3, 4);

int main(void)
{
	int ret;
	bool led_state = true;

	if (!gpio_is_ready_dt(&led)) {
		return 0;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return 0;
	}

	struct i2s_config cfg = {
		.word_size = WORD_BITS,
		.channels = CHANNELS,
		.format = I2S_FMT_DATA_FORMAT_I2S,
		.options = I2S_OPT_BIT_CLK_MASTER | I2S_OPT_FRAME_CLK_MASTER,
		.frame_clk_freq = SAMPLE_RATE_HZ,
		.mem_slab = &slab,
		.block_size = MEM_BLOCK_BYTESIZE,
		.timeout = 1000,
	};

	ret = i2s_configure(i2s_dev, I2S_DIR_RX, &cfg);
	if (ret < 0) {
		LOG_ERR("FAILED");
		return -EIO;
	}

	ret = i2s_trigger(i2s_dev, I2S_DIR_RX, I2S_TRIGGER_START);
    if (ret < 0) {
      LOG_ERR("I2S Trigger start failed");
      return -EIO;
    }

	while (1) {
		void* blk;
		size_t blk_sz;
		int ret = i2s_read(i2s_dev, &blk, &blk_sz);
		if (ret != 0) {
			/* Why is there no data? */
			LOG_ERR("No data. %i", ret);
			return -EIO;
		}

		ret = gpio_pin_toggle_dt(&led);
		if (ret < 0) {
			return 0;
		}

		led_state = !led_state;
		printf("LED state: %s\n", led_state ? "ON" : "OFF");
		k_msleep(SLEEP_TIME_MS);
	}
	return 0;
}


the following is my overlay:

/ {
    aliases {
        i2srx = &sai1;
    };
};

// See comment in frdm_mcxn947_mcxn947_cpu0.dtsi
&flexcomm6_lpspi6 {
	status = "disabled";
};

 The following is my prj.conf

CONFIG_GPIO=y
CONFIG_I2S=y
CONFIG_DMA=y

CONFIG_DEBUG=y
CONFIG_LOG=y
CONFIG_I2S_LOG_LEVEL_DBG=y
CONFIG_DMA_LOG_LEVEL_DBG=y


To get a clearer picture im also attaching a .zip of the project, which is a simple blinky with added the baseline functions needed to retrieve data from the microphones, can someone please help out or direct me to something that could help understand the issue? 

0 项奖励
回复
1 解答
547 次查看
Harry_Zhang
NXP Employee
NXP Employee

Hi @raimbowgeddon 

In zephyr/boards/nxp/frdm_mcxn947/board.c

#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sai0)) || DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sai1))
        /* < Set up PLL1 */
        const pll_setup_t pll1_Setup = {
                .pllctrl = SCG_SPLLCTRL_SOURCE(1U) | SCG_SPLLCTRL_SELI(3U) |
                                 SCG_SPLLCTRL_SELP(1U),
                .pllndiv = SCG_SPLLNDIV_NDIV(25U),
                .pllpdiv = SCG_SPLLPDIV_PDIV(10U),
                .pllmdiv = SCG_SPLLMDIV_MDIV(256U),
                .pllRate = 24576000U};

        /* Configure PLL1 to the desired values */
        CLOCK_SetPLL1Freq(&pll1_Setup);
        /* Set PLL1 CLK0 divider to value 1 */
        CLOCK_SetClkDiv(kCLOCK_DivPLL1Clk0, 1U);
#endif

Did you set 

&sai1 {
    status = "okay";
};

in overlay file?

BR

Harry

在原帖中查看解决方案

0 项奖励
回复
1 回复
548 次查看
Harry_Zhang
NXP Employee
NXP Employee

Hi @raimbowgeddon 

In zephyr/boards/nxp/frdm_mcxn947/board.c

#if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sai0)) || DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(sai1))
        /* < Set up PLL1 */
        const pll_setup_t pll1_Setup = {
                .pllctrl = SCG_SPLLCTRL_SOURCE(1U) | SCG_SPLLCTRL_SELI(3U) |
                                 SCG_SPLLCTRL_SELP(1U),
                .pllndiv = SCG_SPLLNDIV_NDIV(25U),
                .pllpdiv = SCG_SPLLPDIV_PDIV(10U),
                .pllmdiv = SCG_SPLLMDIV_MDIV(256U),
                .pllRate = 24576000U};

        /* Configure PLL1 to the desired values */
        CLOCK_SetPLL1Freq(&pll1_Setup);
        /* Set PLL1 CLK0 divider to value 1 */
        CLOCK_SetClkDiv(kCLOCK_DivPLL1Clk0, 1U);
#endif

Did you set 

&sai1 {
    status = "okay";
};

in overlay file?

BR

Harry

0 项奖励
回复
%3CLINGO-SUB%20id%3D%22lingo-sub-2304847%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E4%BD%BF%E7%94%A8%20FRDM-MCXN947%20%E7%9A%84%20Zephyr%20%E4%B8%AD%E7%9A%84%20SAI%20%E6%A8%A1%E5%9D%97%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2304847%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E5%A4%A7%E5%AE%B6%E5%A5%BD%3C%2FP%3E%3CP%3E%E6%88%91%E6%9C%80%E8%BF%91%E4%B8%BA%E6%88%91%E5%85%AC%E5%8F%B8%E7%9A%84%E9%A1%B9%E7%9B%AE%E8%B4%AD%E4%B9%B0%E4%BA%86%20MCXN947%20%E8%AF%84%E4%BC%B0%E6%9D%BF%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%AE%83%E7%9C%8B%E8%B5%B7%E6%9D%A5%E9%9D%9E%E5%B8%B8%E9%80%82%E5%90%88%E6%88%91%E4%BB%AC%E7%9A%84%E9%9C%80%E6%B1%82%EF%BC%8C%E8%80%8C%E4%B8%94%E5%AE%83%E5%8E%9F%E7%94%9F%E6%94%AF%E6%8C%81%E6%88%91%E4%BB%AC%E7%9A%84%E9%A6%96%E9%80%89%20RTO%20Zephyr%E3%80%82%3C%2FP%3E%3CP%3E%E6%88%91%E5%9C%A8%E9%80%9A%E8%BF%87%20SAI%20%E6%A8%A1%E5%9D%97%E8%AE%BE%E7%BD%AE%20I2S%20%E9%80%9A%E4%BF%A1%E4%BB%A5%E4%BB%8E%20mems%20%E9%BA%A6%E5%85%8B%E9%A3%8E%E6%A3%80%E7%B4%A2%E6%95%B0%E6%8D%AE%E6%97%B6%E9%81%87%E5%88%B0%E4%BA%86%E9%BA%BB%E7%83%A6%EF%BC%8C%E5%B0%BD%E7%AE%A1%E6%98%AF%E5%8F%A6%E4%B8%80%E5%AE%B6%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%85%AC%E5%8F%B8%EF%BC%8C%E4%BD%86%E8%BF%99%E6%AE%B5%E4%BB%A3%E7%A0%81%E5%B7%B2%E7%BB%8F%E9%80%82%E7%94%A8%E4%BA%8E%E5%8F%A6%E4%B8%80%E5%AE%B6%20soC%E3%80%82%3C%2FP%3E%3CP%3E%E6%8D%AE%E6%88%91%E4%BA%86%E8%A7%A3%EF%BC%8C%E6%9D%BF%E5%BC%80%E7%AE%B1%E5%8D%B3%E7%94%A8%E7%9A%84%E6%89%80%E6%9C%89%20R0%20%E9%83%BD%E5%B7%B2%E6%AD%A3%E7%A1%AE%E8%AE%BE%E7%BD%AE%EF%BC%8C%E4%BB%A5%E4%BE%BF%E5%B0%86%20SAI1%20%E4%BF%A1%E5%8F%B7%E6%98%A0%E5%B0%84%E5%88%B0%E5%8F%AF%E7%94%A8%E5%BC%95%E8%84%9A%E4%B8%8A%EF%BC%8C%E5%AE%83%E4%BB%AC%E4%BB%85%E4%B8%8E%20LPSPI6%20%E5%BC%95%E8%84%9A%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81%EF%BC%8C%E5%B9%B6%E4%BD%9C%E4%B8%BA%20.dtsi%E6%96%87%E4%BB%B6%E5%BB%BA%E8%AE%AE%20(frdm_mcxn947_mcxn947_cpu0.dtsi)%E6%88%91%E7%A6%81%E7%94%A8%E4%BA%86%20flexcomm6%20%E8%8A%82%E7%82%B9%E3%80%82%E6%88%91%E7%95%99%E4%B8%8B%E4%BA%86%20.pinctrl%E5%B9%B6%E5%B0%86%E5%AD%97%E9%80%89%E6%8B%A9%20(FS)%20%E8%BF%9E%E6%8E%A5%E5%88%B0%20PT3_19%EF%BC%8C%E5%B0%86%E4%BD%8D%E6%97%B6%E9%92%9F%20(BCLK)%20%E8%BF%9E%E6%8E%A5%E5%88%B0%20PT3_18%EF%BC%8C%E6%9C%80%E5%90%8E%E5%B0%86%E6%95%B0%E6%8D%AE%E7%BA%BF%20(D0)%20%E8%BF%9E%E6%8E%A5%E5%88%B0%20PT3_21%E3%80%82%E9%80%9A%E8%BF%87%E7%A4%BA%E6%B3%A2%E5%99%A8%EF%BC%8C%E6%88%91%E5%8F%AF%E4%BB%A5%E7%A1%AE%E8%AE%A4%E5%9C%A8%E4%BD%BF%E7%94%A8%20i2s_trigger%20%E5%87%BD%E6%95%B0%E5%8F%91%E5%87%BA%20I2S_TRIGGER_START%20%E4%B9%8B%E5%90%8E%EF%BC%8CFS%20%E5%92%8C%20BTCLK%20%E7%BA%BF%E8%B7%AF%E4%B8%8A%E6%B2%A1%E6%9C%89%E4%BF%A1%E5%8F%B7%E5%87%BA%E7%8E%B0%E3%80%82%3C%2FP%3E%3CP%3E%E4%B8%8B%E9%9D%A2%E6%98%AF%20main.c%EF%BC%9A%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3E%23include%20%3CSTDIO.H%3E%0A%23include%20%3CZEPHYR%3E%0A%23include%20%3CZEPHYR%3E%0A%23include%20%22math.h%22%0A%0A%23include%20%3CZEPHYR%3E%0A%23include%20%3CZEPHYR%3E%0A%23include%20%3CZEPHYR%3E%0A%0ALOG_MODULE_REGISTER(Main)%3B%0A%0A%2F*%201000%20msec%20%3D%201%20sec%20*%2F%0A%23define%20SLEEP_TIME_MS%20%20%201000%0A%0A%2F*%20The%20devicetree%20node%20identifier%20for%20the%20%22led0%22%20alias.%20*%2F%0A%23define%20LED0_NODE%20DT_ALIAS(led0)%0A%0A%2F*%0A%20*%20A%20build%20error%20on%20this%20line%20means%20your%20board%20is%20unsupported.%0A%20*%20See%20the%20sample%20documentation%20for%20information%20on%20how%20to%20fix%20this.%0A%20*%2F%0Astatic%20const%20struct%20gpio_dt_spec%20led%20%3D%20GPIO_DT_SPEC_GET(LED0_NODE%2C%20gpios)%3B%0A%0Astatic%20const%20struct%20device*%20i2s_dev%20%3D%20DEVICE_DT_GET(DT_ALIAS(i2srx))%3B%0A%0A%23define%20SAMPLE_RATE_HZ%2048000%0A%23define%20WORD_BITS%2032%0A%23define%20WORD_BYTES%20%204%0A%23define%20CHANNELS%201%0A%23define%20FRAME_BYTES%20(CHANNELS%20*%20WORD_BYTES)%0A%23define%20I2S_RX_DURATION_MS%2010%0A%23define%20MEM_BLOCK_SIZE%20(SAMPLE_RATE_HZ%20*%20(CHANNELS%20*%200.001%20*%20I2S_RX_DURATION_MS))%0A%23define%20MEM_BLOCK_BYTESIZE%20(MEM_BLOCK_SIZE%20*%20WORD_BYTES)%0A%0AK_MEM_SLAB_DEFINE(slab%2C%20(size_t)MEM_BLOCK_BYTESIZE%2C%203%2C%204)%3B%0A%0Aint%20main(void)%0A%7B%0A%09int%20ret%3B%0A%09bool%20led_state%20%3D%20true%3B%0A%0A%09if%20(!gpio_is_ready_dt(%26amp%3Bled))%20%7B%0A%09%09return%200%3B%0A%09%7D%0A%0A%09ret%20%3D%20gpio_pin_configure_dt(%26amp%3Bled%2C%20GPIO_OUTPUT_ACTIVE)%3B%0A%09if%20(ret%20%26lt%3B%200)%20%7B%0A%09%09return%200%3B%0A%09%7D%0A%0A%09struct%20i2s_config%20cfg%20%3D%20%7B%0A%09%09.word_size%20%3D%20WORD_BITS%2C%0A%09%09.channels%20%3D%20CHANNELS%2C%0A%09%09.format%20%3D%20I2S_FMT_DATA_FORMAT_I2S%2C%0A%09%09.options%20%3D%20I2S_OPT_BIT_CLK_MASTER%20%7C%20I2S_OPT_FRAME_CLK_MASTER%2C%0A%09%09.frame_clk_freq%20%3D%20SAMPLE_RATE_HZ%2C%0A%09%09.mem_slab%20%3D%20%26amp%3Bslab%2C%0A%09%09.block_size%20%3D%20MEM_BLOCK_BYTESIZE%2C%0A%09%09.timeout%20%3D%201000%2C%0A%09%7D%3B%0A%0A%09ret%20%3D%20i2s_configure(i2s_dev%2C%20I2S_DIR_RX%2C%20%26amp%3Bcfg)%3B%0A%09if%20(ret%20%26lt%3B%200)%20%7B%0A%09%09LOG_ERR(%22FAILED%22)%3B%0A%09%09return%20-EIO%3B%0A%09%7D%0A%0A%09ret%20%3D%20i2s_trigger(i2s_dev%2C%20I2S_DIR_RX%2C%20I2S_TRIGGER_START)%3B%0A%20%20%20%20if%20(ret%20%26lt%3B%200)%20%7B%0A%20%20%20%20%20%20LOG_ERR(%22I2S%20Trigger%20start%20failed%22)%3B%0A%20%20%20%20%20%20return%20-EIO%3B%0A%20%20%20%20%7D%0A%0A%09while%20(1)%20%7B%0A%09%09void*%20blk%3B%0A%09%09size_t%20blk_sz%3B%0A%09%09int%20ret%20%3D%20i2s_read(i2s_dev%2C%20%26amp%3Bblk%2C%20%26amp%3Bblk_sz)%3B%0A%09%09if%20(ret%20!%3D%200)%20%7B%0A%09%09%09%2F*%20Why%20is%20there%20no%20data%3F%20*%2F%0A%09%09%09LOG_ERR(%22No%20data.%20%25i%22%2C%20ret)%3B%0A%09%09%09return%20-EIO%3B%0A%09%09%7D%0A%0A%09%09ret%20%3D%20gpio_pin_toggle_dt(%26amp%3Bled)%3B%0A%09%09if%20(ret%20%26lt%3B%200)%20%7B%0A%09%09%09return%200%3B%0A%09%09%7D%0A%0A%09%09led_state%20%3D%20!led_state%3B%0A%09%09printf(%22LED%20state%3A%20%25s%5Cn%22%2C%20led_state%20%3F%20%22ON%22%20%3A%20%22OFF%22)%3B%0A%09%09k_msleep(SLEEP_TIME_MS)%3B%0A%09%7D%0A%09return%200%3B%0A%7D%3C%2FZEPHYR%3E%3C%2FZEPHYR%3E%3C%2FZEPHYR%3E%3C%2FZEPHYR%3E%3C%2FZEPHYR%3E%3C%2FSTDIO.H%3E%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%3CBR%20%2F%3E%E4%B8%8B%E9%9D%A2%E6%98%AF%E6%88%91%E7%9A%84%E5%8F%A0%E5%8A%A0%EF%BC%9A%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3E%2F%20%7B%0A%20%20%20%20aliases%20%7B%0A%20%20%20%20%20%20%20%20i2srx%20%3D%20%26amp%3Bsai1%3B%0A%20%20%20%20%7D%3B%0A%7D%3B%0A%0A%2F%2F%20See%20comment%20in%20frdm_mcxn947_mcxn947_cpu0.dtsi%0A%26amp%3Bflexcomm6_lpspi6%20%7B%0A%09status%20%3D%20%22disabled%22%3B%0A%7D%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%E6%88%91%E7%9A%84%20prj.conf%20%E6%96%87%E4%BB%B6%E5%A6%82%E4%B8%8B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3ECONFIG_GPIO%3Dy%0ACONFIG_I2S%3Dy%0ACONFIG_DMA%3Dy%0A%0ACONFIG_DEBUG%3Dy%0ACONFIG_LOG%3Dy%0ACONFIG_I2S_LOG_LEVEL_DBG%3Dy%0ACONFIG_DMA_LOG_LEVEL_DBG%3Dy%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%3CBR%20%2F%3E%E4%B8%BA%E4%BA%86%E6%9B%B4%E6%B8%85%E6%A5%9A%E5%9C%B0%E4%BA%86%E8%A7%A3%E6%83%85%E5%86%B5%EF%BC%8C%E6%88%91%E8%BF%98%E9%99%84%E4%B8%8A%E4%BA%86%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AE%E7%9A%84%20.zip%EF%BC%8C%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E9%97%AA%E7%83%81%E9%A1%B9%E7%9B%AE%EF%BC%8C%E6%B7%BB%E5%8A%A0%E4%BA%86%E4%BB%8E%E9%BA%A6%E5%85%8B%E9%A3%8E%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE%E6%89%80%E9%9C%80%E7%9A%84%E5%9F%BA%E7%BA%BF%E5%8A%9F%E8%83%BD%EF%BC%8C%E8%AF%B7%E9%97%AE%E8%B0%81%E8%83%BD%E5%B8%AE%E5%B8%AE%E6%88%91%EF%BC%8C%E6%88%96%E8%80%85%E6%8C%87%E5%AF%BC%E6%88%91%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%9F%20%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2304847%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3E%E9%9F%B3%E9%A2%91%EF%BC%88PDM%20%7C%20I2S%20%7C%20SAI%EF%BC%89%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3E%E9%80%9A%E4%BF%A1%26amp%3B%20%E6%8E%A7%E5%88%B6%EF%BC%88I3C%20%7C%20I2C%20%7C%20SPI%20%7C%20FlexCAN%20%7C%20%E4%BB%A5%E5%A4%AA%E7%BD%91%20%7C%20FlexIO%EF%BC%89%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E