Макросы драйвера Spi

Я не могу понять логику макросов и то, как они работают... поэтому я могу сделать функцию mcp2515_init(). Если кто-то может объяснить, я был бы рад выслушать, спасибо за ваше время.

#define true    1
#define false   0

#define True    1
#define False   0

typedef _Bool bool;



#define RESET(x)        _XRS(x)
#define SET(x)          _XS(x)
#define TOGGLE(x)       _XT(x)
#define SET_OUTPUT(x)   _XSO(x)
#define SET_INPUT(x)    _XSI(x)
#define IS_SET(x)       _XR(x)

#define PORT(x)         _port2(x)
#define DDR(x)          _ddr2(x)
#define PIN(x)          _pin2(x)

#define _XRS(x,y)   PORT(x) &= ~(1<<y)
#define _XS(x,y)    PORT(x) |= (1<<y)
#define _XT(x,y)    PORT(x) ^= (1<<y)

#define _XSO(x,y)   DDR(x) |= (1<<y)
#define _XSI(x,y)   DDR(x) &= ~(1<<y)

#define _XR(x,y)    ((PIN(x) & (1<<y)) != 0)

#define _port2(x)   PORT ## x
#define _ddr2(x)    DDR ## x
#define _pin2(x)    PIN ## x

person Parge Beniamin    schedule 10.05.2019    source источник


Ответы (1)


Я попытаюсь разобрать его, то, что у вас есть, представляет собой набор макросов, манипулирующих битами, переворачивающих / устанавливающих / очищающих один бит в порту, они представляют собой общий вид макросов, а не специфичный для драйвера SPI.

битовая чистка (сброс)

#define _XRS(x,y)   PORT(x) &= ~(1<<y)

И порт с каждым битом ожидает бит y на порту x.

установлен бит

#define _XS(x,y)    PORT(x) |= (1<<y)

ИЛИ порт только с установленным битом y. Это установит бит y и не затронет остальные.

переключить

#define _XT(x,y)    PORT(x) ^= (1<<y)

Бит XOR с 1 изменит свое значение, 0 сохранит свое состояние.

Этот список макросов принимает только один аргумент

#define RESET(x)        _XRS(x)
#define SET(x)          _XS(x)
#define TOGGLE(x)       _XT(x)
#define SET_OUTPUT(x)   _XSO(x)
#define SET_INPUT(x)    _XSI(x)
#define IS_SET(x)       _XR(x)

поэтому эти макросы не выглядят совместимыми с , поскольку они принимают один параметр вместо двух, но с помощью магии макросов можно создать вывод, например, x,y

#define GPIO1_PIN4 1,4
#define POWER_LED GPIO0,PIN2

сделает SET(POWER_LED); законным назначением.

Макросы # и ##

#define _port2(x)   PORT ## x

Используются для объединения выходных данных макросов для создания новых структур подробнее здесь

Таким образом, использование всех макросов _XT(2,15); расширится до

PORT2 = PORT2 ^ (1<<15)

Лично я не являюсь поклонником макросов такого типа, так как они ломают принцип работы обычного ванильного C, скрывая назначения внутри макросов, например, этот стиль не может устанавливать несколько битов на один и тот же порт с одной записью. Однако это разрешенный C, и он распространен среди некоторых сред разработки встраиваемых систем.

Вероятно, было бы проще игнорировать указанные выше макросы и просто записывать конфигурацию и данные непосредственно в регистры слово за словом.

person Simson    schedule 01.10.2019