海思NB-IOT模塊HI2115芯片I2C通信


1. 首先確定硬件上I2C的引腳,手冊上並沒有,海思技術支持說是14和15腳,我們用的是12和13腳,問題在於,如果是硬件I2C應該不能隨便換個引腳吧,難道是模擬的時序?

2. 下一個奇怪的地方,這個寄存器居然只有兩行,沒其他地方使用,真奇怪?

看下相關的代碼

3. PIO的設置

static I2C_RET i2c_set_pio(PIN pin, FUNC i2c_func) { if (pin != PIN_NONE) { if(!pio_set_function(pin, i2c_func)) { return I2C_RET_ERROR; } } }

繼續往下看,最終設置的是下面的,還是直接寫寄存器的意思?不過后面的半句話不太明白什么意思,意思是把這個數組放到外設的代碼段里面。

 

/** * Direct access to register address space for all PIOs */
static volatile HAL_PIO_REGISTER_MAP hal_pio_registers[ PIN_MAX_NUMBER ] __attribute__((section(".peripherals")));

 

果然是對應寄存器的值

typedef struct { //lint -esym(754,HAL_PIO_REGISTER_MAP::*) Some of these aren't used directly.
    uint32 pio_claim;          //!< Peripheral claim register - register layout is different for a read compared to a write
    uint32 pio_ctrl;           //!< PIO_CTRL register
    uint32 pio_irq_clr;        //!< PIO_IRQ_CLR register
    uint32 reserved_0;         //!< Reserved
    uint32 reserved_1;         //!< Reserved
    uint32 pio_ctrl_bitset;    //!< PIO_CTRL_BITSET register
    uint32 reserved_2;         //!< Reserved
    uint32 reserved_3;         //!< Reserved
    uint32 reserved_4;         //!< Reserved
    uint32 pio_ctrl_bitclr;    //!< PIO_CTRL_BITCLR register
    uint32 reserved_5;         //!< Reserved
    uint32 reserved_6;         //!< Reserved
    uint32 reserved_7;         //!< Reserved
    uint32 pio_ctrl_bittog;    //!< PIO_CTRL_BITTOG register
    uint32 reserved_8;         //!< Reserved
    uint32 reserved_9;         //!< Reserved
} HAL_PIO_REGISTER_MAP;

 

看下FUNC的配置,這個應該是引腳復用圖吧,難道每個引腳都可以隨便作為任何功能?

typedef enum { FUNC_UNCLAIMED = 0, FUNC_GPIO = 1, FUNC_UART0_TXD = 2, FUNC_UART0_TXIR = 3, FUNC_UART0_O2 = 4, FUNC_UART0_O1 = 5, FUNC_UART0_RTS = 6, FUNC_UART0_DTR = 7, FUNC_UART0_RXD = 8, FUNC_UART0_RXIR = 9, FUNC_UART0_CTS = 10, FUNC_UART0_DCD = 11, FUNC_UART0_DSR = 12, FUNC_UART0_RI = 13, FUNC_UART1_TXD = 14, FUNC_UART1_TXIR = 15, FUNC_UART1_O2 = 16, FUNC_UART1_O1 = 17, FUNC_UART1_RTS = 18, FUNC_UART1_DTR = 19, FUNC_UART1_RXD = 20, FUNC_UART1_RXIR = 21, FUNC_UART1_CTS = 22, FUNC_UART1_DCD = 23, FUNC_UART1_DSR = 24, FUNC_UART1_RI = 25, FUNC_LPUART_RXD = 26, FUNC_LPUART_TXD = 27, FUNC_DBG_CLK0 = 112, FUNC_DBG_CLK1 = 113, FUNC_DBG_CLK2 = 114, FUNC_DBG_CLK3 = 115, FUNC_RADIO_PIO = 128, FUNC_UICC_CLK = 129, FUNC_UICC_RST = 130, FUNC_UICC_IO = 131, FUNC_DSP_TMS = 132, FUNC_DSP_TDI = 133, FUNC_DSP_TDO = 134, FUNC_DSP_TRST = 135, FUNC_SPI_SCLK = 136, FUNC_SPI_CSB = 137, FUNC_SPI_UNIDIR_IN = 138, FUNC_SPI_UNIDIR_OUT = 139, FUNC_SPI_BIDIR_DATA0 = 140, FUNC_SPI_BIDIR_DATA1 = 141, FUNC_SPI_BIDIR_DATA2 = 142, FUNC_SPI_BIDIR_DATA3 = 143, FUNC_DSP_TCK = 144, FUNC_RADIO_RFFE_SCLK = 145, FUNC_RADIO_RFFE_SDATA = 146, FUNC_PWM0 = 192, FUNC_PWM0B = 193, FUNC_PWM1 = 194, FUNC_PWM1B = 195, FUNC_SSP0TXD = 196, FUNC_SSP0RXD = 197, FUNC_SSP0TRX = 198, FUNC_SSP0CLK = 199, FUNC_SSP0FSS = 200, FUNC_SSP1TXD = 201, FUNC_SSP1RXD = 202, FUNC_SSP1TRX = 203, FUNC_SSP1CLK = 204, FUNC_SSP1FSS = 205, FUNC_I2C0_SDA = 206, FUNC_I2C0_SCL = 207, FUNC_I2C1_SDA = 208, FUNC_I2C1_SCL = 209, FUNC_UART2_TXD = 210, FUNC_UART2_TXIR = 211, FUNC_UART2_O2 = 212, FUNC_UART2_O1 = 213, FUNC_UART2_RTS = 214, FUNC_UART2_DTR = 215, FUNC_UART2_RXD = 216, FUNC_UART2_RXIR = 217, FUNC_UART2_CTS = 218, FUNC_UART2_DCD = 219, FUNC_UART2_DSR = 220, FUNC_UART2_RI = 221, FUNC_MAX = 222    //!< Limit to range of valid values
} FUNC;

芯片的數據手冊,這樣說起來,這24個PIO可以復用到任何的外設上。現在問題是一共有40個PIO,說的是那24個PIO?

4. 說是PIO分為4個區域,每個區域的電壓似乎可以不一樣

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM