LPS25HB 暫存器讀寫程式解讀

2021-10-07 21:32:40 字數 4378 閱讀 9492

一般地,晶元公司都會提供晶元驅動的一些驅動**,以lps25hb 為例,該mems工作時,與主mcu通訊通過iic或者spi的方式進行,從而實現mems的暫存器的讀寫。

為了相容iic和spi的通訊,我們這裡設計兩個基於stm32 hal 庫的的讀寫函式platform_write()、platform_read():

static

int32_t

platform_write

(void

*handle,

uint8_t reg,

uint8_t

*bufp,

uint16_t len)

#ifdef mki109v2

else

if(handle ==

&hspi2)

else

if(handle ==

&hspi1)

#endif

return0;

}static

int32_t

platform_read

(void

*handle,

uint8_t reg,

uint8_t

*bufp,

uint16_t len)

#ifdef mki109v2

else

if(handle ==

&hspi2)

else

#endif

return0;

}

typedef

int32_t

(*lps25hb_write_ptr)

(void*,

uint8_t

,uint8_t*,

uint16_t);

typedef

int32_t

(*lps25hb_read_ptr)

(void*,

uint8_t

,uint8_t*,

uint16_t);

typedef

struct

lps25hb_ctx_t;

這樣我們定義了乙個結構體lps25hb_ctx_t,該結構體中設計了三個指標。通過宣告乙個該結構體的變數,將變數的成員指向統一的讀寫結構函式。

/* initialize mems driver inte***ce */

lps25hb_ctx_t dev_ctx;

dev_ctx.write_reg = platform_write;

dev_ctx.read_reg = platform_read;

dev_ctx.handle =

&hi2c1;

這樣mems 的驅動介面就實現了。但是為了程式更好的可讀性,我們需要將mems 暫存器讀寫的具體功能函式進一步實現。

這裡我們設計與上層介面函式無關的暫存器讀寫函式,利用還函式實現mems內部所有暫存器的讀寫。

/**

* @brief read generic device register

* * @param ctx read / write inte***ce definitions(ptr)

* @param reg register to read

* @param data pointer to buffer that store the data read(ptr)

* @param len number of consecutive register to read

* @retval inte***ce status (mandatory: return 0 -> no error)

* */

int32_t

lps25hb_read_reg

(lps25hb_ctx_t* ctx,

uint8_t reg,

uint8_t

* data,

uint16_t len)

/** * @brief write generic device register

* * @param ctx read / write inte***ce definitions(ptr)

* @param reg register to write

* @param data pointer to data to write in register reg(ptr)

* @param len number of consecutive register to write

* @retval inte***ce status (mandatory: return 0 -> no error)

* */

int32_t

lps25hb_write_reg

(lps25hb_ctx_t* ctx,

uint8_t reg,

uint8_t

* data,

uint16_t len)

這樣,我們就實現了介面函式的對應關係

於是,我們可以根據mems的暫存器表進行相關的暫存器讀寫設計了。

如:

/**

* @brief the reference pressure value is a 24-bit data expressed as 2』s

* complement. the value is used when autozero or autorifp function

* is enabled.[set]

* * @param ctx read / write inte***ce definitions.(ptr)

* @param buff buffer that contains data to write

* @retval inte***ce status (mandatory: return 0 -> no error).

* */

int32_t

lps25hb_pressure_ref_set

(lps25hb_ctx_t *ctx,

uint8_t

*buff)

/** * @brief the reference pressure value is a 24-bit data expressed as 2』s

* complement. the value is used when autozero or autorifp function

* is enabled.[get]

* * @param ctx read / write inte***ce definitions.(ptr)

* @param buff buffer that stores data read.(ptr)

* @retval inte***ce status (mandatory: return 0 -> no error).

* */

int32_t

lps25hb_pressure_ref_get

(lps25hb_ctx_t *ctx,

uint8_t

*buff)

4、暫存器的資料描述:

暫存器表的資料描述包括 define 定義、結構體資料型別定義、列舉變數的定義

例如:

#define lps25hb_ctrl_reg1       0x20u

typedef

struct

lps25hb_ctrl_reg1_t;

#define lps25hb_ctrl_reg2 0x21u

typedef

struct

lps25hb_ctrl_reg2_t;

#define lps25hb_ctrl_reg3 0x22u

typedef

struct

lps25hb_ctrl_reg3_t;

#define lps25hb_ctrl_reg4 0x23u

typedef

struct

lps25hb_ctrl_reg4_t;

typedef

enum

lps25hb_f_mode_t;

這樣,依賴這些個暫存器變數的描述,設計相關的具體的某乙個暫存器讀寫函式,mems 的驅動程式**就可以輕鬆實現了。

通用暫存器 記憶體讀寫

暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...

Linux下讀寫暫存器

arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...

Linux下讀寫暫存器

arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...