#c #arm #cortex-m #texas-instruments #cmsis
#c #arm #cortex-m #texas-instruments #cmsis
Вопрос:
Мне было интересно, как я могу связать драйвер CMSIS, например структуру данных драйвера I2C, с его физическим периферийным устройством?
Итак, вот структура в Driver_I2C.h
typedef struct _ARM_DRIVER_I2C {
ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to ref ARM_I2C_GetVersion : Get driver version.
ARM_I2C_CAPABILITIES (*GetCapabilities)(void); ///< Pointer to ref ARM_I2C_GetCapabilities : Get driver capabilities.
int32_t (*Initialize) (ARM_I2C_SignalEvent_t cb_event); ///< Pointer to ref ARM_I2C_Initialize : Initialize I2C Interface.
int32_t (*Uninitialize) (void); ///< Pointer to ref ARM_I2C_Uninitialize : De-initialize I2C Interface.
int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to ref ARM_I2C_PowerControl : Control I2C Interface Power.
int32_t (*MasterTransmit) (uint32_t addr, const uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to ref ARM_I2C_MasterTransmit : Start transmitting data as I2C Master.
int32_t (*MasterReceive) (uint32_t addr, uint8_t *data, uint32_t num, bool xfer_pending); ///< Pointer to ref ARM_I2C_MasterReceive : Start receiving data as I2C Master.
int32_t (*SlaveTransmit) ( const uint8_t *data, uint32_t num); ///< Pointer to ref ARM_I2C_SlaveTransmit : Start transmitting data as I2C Slave.
int32_t (*SlaveReceive) ( uint8_t *data, uint32_t num); ///< Pointer to ref ARM_I2C_SlaveReceive : Start receiving data as I2C Slave.
int32_t (*GetDataCount) (void); ///< Pointer to ref ARM_I2C_GetDataCount : Get transferred data count.
int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to ref ARM_I2C_Control : Control I2C Interface.
ARM_I2C_STATUS (*GetStatus) (void); ///< Pointer to ref ARM_I2C_GetStatus : Get I2C status.
} const ARM_DRIVER_I2C;
Я создаю переменную, которая использует эту структуру в моем main.c :
ARM_DRIVER_I2C Driver_I2C0; //Create a instance of I2C0
Но как мне связать эту переменную с периферийным устройством I2C0 CMSIS Cortex M4? (TM4C123GH6PM.h)
typedef struct { /*!< I2C0 Structure */
__IO uint32_t MSA; /*!< I2C Master Slave Address */
union {
__IO uint32_t MCS_I2C0_ALT; /*!< I2C Master Control/Status */
__IO uint32_t MCS; /*!< I2C Master Control/Status */
};
__IO uint32_t MDR; /*!< I2C Master Data */
__IO uint32_t MTPR; /*!< I2C Master Timer Period */
__IO uint32_t MIMR; /*!< I2C Master Interrupt Mask */
__IO uint32_t MRIS; /*!< I2C Master Raw Interrupt Status */
__IO uint32_t MMIS; /*!< I2C Master Masked Interrupt Status */
__O uint32_t MICR; /*!< I2C Master Interrupt Clear */
__IO uint32_t MCR; /*!< I2C Master Configuration */
__IO uint32_t MCLKOCNT; /*!< I2C Master Clock Low Timeout Count */
__I uint32_t RESERVED0;
__IO uint32_t MBMON; /*!< I2C Master Bus Monitor */
__I uint32_t RESERVED1[2];
__IO uint32_t MCR2; /*!< I2C Master Configuration 2 */
__I uint32_t RESERVED2[497];
__IO uint32_t SOAR; /*!< I2C Slave Own Address */
union {
__IO uint32_t SCSR_I2C0_ALT; /*!< I2C Slave Control/Status */
__IO uint32_t SCSR; /*!< I2C Slave Control/Status */
};
__IO uint32_t SDR; /*!< I2C Slave Data */
__IO uint32_t SIMR; /*!< I2C Slave Interrupt Mask */
__IO uint32_t SRIS; /*!< I2C Slave Raw Interrupt Status */
__IO uint32_t SMIS; /*!< I2C Slave Masked Interrupt Status */
__O uint32_t SICR; /*!< I2C Slave Interrupt Clear */
__IO uint32_t SOAR2; /*!< I2C Slave Own Address 2 */
__IO uint32_t SACKCTL; /*!< I2C Slave ACK Control */
__I uint32_t RESERVED3[487];
__IO uint32_t PP; /*!< I2C Peripheral Properties */
__IO uint32_t PC; /*!< I2C Peripheral Configuration */
} I2C0_Type;
Вопрос: Есть ли в шаблоне CMSIS способ обработки этой ссылки или мне нужно сделать это самостоятельно, добавив указатель на эту структуру M4 Cortex, например?
Спасибо 🙂
Комментарии:
1. Я не могу понять, какое отношение одно имеет к другому. Один из них — это регистры, которым нужен драйвер, если вы хотите, чтобы они работали, другой связан с некоторой библиотекой высокого уровня (/ driver). Поэтому вам нужно заполнить пробел кодом, специфичным для чипа / периферийного устройства. Которое ti должен был предоставить. Просто используйте изолированную среду ti, если вы не хотите настраивать периферийное устройство самостоятельно.
2. Ну, если я правильно понимаю, я должен заполнить пробел в Driver_I2C.c, где указаны функции keil.com/pack/doc/cmsis/driver/html/Driver__I2C_8c.html Но если мне нужно сделать эту библиотеку переносимой, мне нужно указать где-нибудь периферийное устройство для правильного использования?
3. Зачем заново изобретать колесо, если вы чувствуете необходимость использовать CMSIS, просто используйте код из ti, включая любую изолированную среду и примеры. Или избегайте CMSIS и используйте периферийное устройство напрямую, или используйте библиотеку pre-cmsis (от ti, конечно).
4. Что не так с решением ti, что вы пытаетесь сделать что-то еще? Что насчет того, что у вас это не сработает?
5. Мне просто было любопытно, как работают CMSIS: D, поэтому я сделал небольшой проект, чтобы лучше ознакомиться со встроенным программированием. Спасибо за ответы, если у вас есть какой-нибудь полезный веб-сайт о встроенном программировании / ARM, мне действительно интересно!