查看: 5766|回复: 4

[已解决] [求助] LPC824 修改 I2C pin

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
25
最后登录
2019-2-27
发表于 2019-2-17 18:32:10 | 显示全部楼层 |阅读模式
Hi

小弟遇到一個問題,需要將I2C從原本的PIO0_11_SDA 和PIO0_10_SCL 修改到 PIO0_24 和PIO0_15。
使用sample code "i2cm_eeprom"
但是I2C沒有通
1. I2C_IRQHandler 沒有被呼叫到
2. 沒有抓到I2C訊號

請求版上高手幫忙解答
感謝!!

修改的地方如下
static void Init_I2C_PinMux(void)
{
#if (defined(BOARD_NXP_LPCXPRESSO_812) || defined(BOARD_LPC812MAX) || defined(BOARD_NXP_LPCXPRESSO_824))
        /* Enable the clock to the Switch Matrix */
        Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
#if defined(BOARD_NXP_LPCXPRESSO_824)
-        Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SDA);
-        Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SCL);

+        Chip_SWM_Init();
+        Chip_SWM_MovablePinAssign(SWM_I2C1_SDA_IO, 24);
+        Chip_SWM_MovablePinAssign(SWM_I2C1_SCL_IO, 15);

#else
        /* Connect the I2C_SDA and I2C_SCL signals to port pins(P0.10, P0.11) */
        Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 10);
        Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 11);
#endif

        /* Enable Fast Mode Plus for I2C pins */
-        //Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO10, PIN_I2CMODE_FASTPLUS);
-        //Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO11, PIN_I2CMODE_FASTPLUS);

        /* Disable the clock to the Switch Matrix to save power */
        Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
#else
        /* Configure your own I2C pin muxing here if needed */
#warning "No I2C pin muxing defined"
#endif
}


void I2C_IRQHandler(void)
{
+        printf("I2C_IRQHandler \r\n",);
        /* Call I2CM ISR function with the I2C device and transfer rec */
        Chip_I2CM_XferHandler(LPC_I2C, &i2cmXferRec);
}



最佳答案

victor790510 发表于 2019-2-19 21:46 Hi 小恩GG 感謝您的回覆! 楼主你好! 官方是有LPC824的从机代码的。 http://www.nxp.com/downloads/en/ ... _lpcxpresso_824.zip 不过是基于I2C0的,但是你可以把接口,中断向 ...
回复

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25449
最后登录
2025-9-4
发表于 2019-2-18 13:54:58 | 显示全部楼层
楼主你好!
如果你使用的是I2C0, 那么这个模块的引脚只能被分配在PIO0_10 和PIO0_11。
28.jpg
所以,如果你要使用其他引脚,你可以使用其他的I2C模块,这个时候,就要注意下I2C1,2,3模块的配置,中断向量表也要用对应的I2C号。



回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
25
最后登录
2019-2-27
 楼主| 发表于 2019-2-19 21:46:29 | 显示全部楼层
Hi 小恩GG

感謝您的回覆!

請問如果要將I2C1 設定成slave mode
使用外部的I2C工具傳送訊號

請問有相關的sample 嗎?

目前我這樣寫接收不到訊號

請求高手給予建議
#include "board.h"



/* System clock is set to 24MHz, I2C clock is set to 600kHz */
#define I2C_CLK_DIVIDER         (40)
/* 100KHz I2C bit-rate */
#define I2C_BITRATE             (100000)

/** Our slave address and I2C information */
#define LPC_I2C_SLAVE         LPC_I2C1
#define I2C_ADDR_SLAVE          (0x32)


/*****************************************************************************
* Private functions
****************************************************************************/

/* Initializes pin muxing for I2C interface */
static void Init_I2C_PinMux(void)
{
#if (defined(BOARD_NXP_LPCXPRESSO_812) || defined(BOARD_LPC812MAX) || defined(BOARD_NXP_LPCXPRESSO_824))
        /* Enable the clock to the Switch Matrix */
        Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
#if defined(BOARD_NXP_LPCXPRESSO_824)
        Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SDA);
        Chip_SWM_EnableFixedPin(SWM_FIXED_I2C0_SCL);

        Chip_SWM_MovablePinAssign(SWM_I2C1_SDA_IO, 15);
        Chip_SWM_MovablePinAssign(SWM_I2C1_SCL_IO, 14);

#else
        /* Connect the I2C_SDA and I2C_SCL signals to port pins(P0.10, P0.11) */
        Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 10);
        Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 11);
#endif

        /* Enable Fast Mode Plus for I2C pins */
        Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO10, PIN_I2CMODE_FASTPLUS);
        Chip_IOCON_PinSetI2CMode(LPC_IOCON, IOCON_PIO11, PIN_I2CMODE_FASTPLUS);

        /* Disable the clock to the Switch Matrix to save power */
        Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
#else
        /* Configure your own I2C pin muxing here if needed */
#warning "No I2C pin muxing defined"
#endif
}

static void setupI2CMaster()
{
        /* Enable I2C clock and reset I2C peripheral */
        Chip_I2C_Init(LPC_I2C);

        /* Setup clock rate for I2C */
        Chip_I2C_SetClockDiv(LPC_I2C, I2C_CLK_DIVIDER);

        /* Setup I2CM transfer rate */
        Chip_I2CM_SetBusSpeed(LPC_I2C, I2C_BITRATE);

        /* Enable Master Mode */
        Chip_I2CM_Enable(LPC_I2C);
}

static void setupI2CSlave(void)
{
        /* Some common I2C init was performed in setupI2CMaster(), so it doesn't
           need to be done again for the slave setup. */

        Chip_I2C_Init(LPC_I2C_SLAVE);
        /* Emulated EEPROM 0 is on slave index 0 */
        Chip_I2CS_SetSlaveAddr(LPC_I2C_SLAVE, 0, I2C_ADDR_SLAVE);
        /* Disable Qualifier for Slave Address 0 */
        Chip_I2CS_SetSlaveQual0(LPC_I2C_SLAVE, false, 0);
        /* Enable Slave Address 0 */
        Chip_I2CS_EnableSlaveAddr(LPC_I2C_SLAVE, 0);

        /* Clear interrupt status and enable slave interrupts */
        Chip_I2CS_ClearStatus(LPC_I2C_SLAVE, I2C_STAT_SLVDESEL);
        Chip_I2C_EnableInt(LPC_I2C_SLAVE, I2C_INTENSET_SLVPENDING | I2C_INTENSET_SLVDESEL);

        /* Enable I2C slave interface */
        Chip_I2CS_Enable(LPC_I2C_SLAVE);
}


void I2C_IRQHandler(void)
{
        printf("I2C_IRQHandler \r\n");
}

void I2C1_IRQHandler(void)
{
        printf("LPC_I2C_SLAVE_HANDLER \r\n");
}


/**
* @brief        Main routine for I2C example
* @return        Function should not exit
*/

int main(void)
{
        printf("Start");
        uint32_t i;
        uint8_t testFail = 0;

        /* Generic Initialization */
        SystemCoreClockUpdate();
        /* Setup I2C pin muxing */
        Init_I2C_PinMux();

    setupI2CMaster();
        setupI2CSlave();

        /* Enable the interrupt for the I2C */
        NVIC_EnableIRQ(I2C_IRQn);
        NVIC_EnableIRQ(I2C1_IRQn);


        while(1)
        {
                printf("Start 3");
                __WFI();
        }

}


Thanks!
回复 支持 反对

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25449
最后登录
2025-9-4
发表于 2019-2-20 15:49:01 | 显示全部楼层
victor790510 发表于 2019-2-19 21:46
Hi 小恩GG

感謝您的回覆!

楼主你好!
官方是有LPC824的从机代码的。
http://www.nxp.com/downloads/en/ ... _lpcxpresso_824.zip
不过是基于I2C0的,但是你可以把接口,中断向量表等换成I2C, 你参考下periph_i2cs_interrupt 工程。
希望能帮到你。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
25
最后登录
2019-2-27
 楼主| 发表于 2019-2-21 23:31:21 | 显示全部楼层
非常感謝,我在測試看看!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-6 17:18 , Processed in 0.097073 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表