stm32_spi_bus_attach_device(RT_AD5791_CS_PIN,"spi1", "spi10")<br>函数声明:rt_err_t stm32_spi_bus_attach_device(rt_uint32_t pin, const char *bus_name, const char *device_name)
struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));//创建spi设备实例
struct rt_spi_device *spi_device
struct stm32_hw_spi_cs *cs_pin = (struct stm32_hw_spi_cs *)rt_malloc(sizeof(struct stm32_hw_spi_cs));//创建spi设备cs脚实例
cs_pin->pin = pin;
rt_pin_mode(pin, PIN_MODE_OUTPUT);//设置CS脚为输出模式
rt_pin_write(pin, 1);
rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin)<br><br>函数声明:rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device,<br>const char *name,<br>const char *bus_name,<br>void *user_data)
bus = rt_device_find(bus_name);
device->bus = (struct rt_spi_bus *)bus;//将spi设备挂入spi总线
result = rt_spidev_device_init(device, name);<br><br>函数声明:rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)
struct rt_device *device;
device = &(dev->parent);
device->type = RT_Device_Class_SPIDevice;
device->read = _spidev_device_read;
函数声明:static rt_size_t _spidev_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
struct rt_spi_device *device;
device = (struct rt_spi_device *)dev;
rt_spi_transfer(device, RT_NULL, buffer, size);
device->write = _spidev_device_write;
与_spidev_device_read;操作类似
device->control = _spidev_device_control;
_spidev_device_control;为空函数
rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);//注册spi设备
rt_memset(&device->config, 0, sizeof(device->config));
device->parent.user_data = user_data;//将cs pin信息保存至spi设备的用户信息区
ad5791_register("ad5791", "spi10");<br>函数声明:rt_err_t ad5791_register(const char * ad5791_device_name, const char * spi_device_name)
struct rt_spi_device * rt_spi_device;
rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name);
spi_ad5791_device.rt_spi_device = rt_spi_device;//为da设备绑定spi设备,注意不是spi总线
struct spi_ad5791_device spi_ad5791_device
struct rt_spi_configuration cfg;<br>cfg.data_width = 8;<br>cfg.mode = RT_SPI_MODE_1 | RT_SPI_MSB; <br>cfg.max_hz = 1 * 1000 * 1000; <br>//SPI配置信息 <br>
rt_spi_configure(spi_ad5791_device.rt_spi_device, &cfg);//配置spi<br><br>函数声明:rt_err_t rt_spi_configure(struct rt_spi_device *device,<br> struct rt_spi_configuration *cfg)
device->config.data_width = cfg->data_width;<br> device->config.mode = cfg->mode & RT_SPI_MODE_MASK ;<br> device->config.max_hz = cfg->max_hz ;
result = rt_mutex_take(&(device->bus->lock), RT_WAITING_FOREVER);
device->bus->ops->configure(device, &device->config);//配置spi寄存器
rt_mutex_release(&(device->bus->lock));
spi_ad5791_device.da_device.type = RT_Device_Class_Char;
spi_ad5791_device.da_device.init = ad5791_init;
函数声明:rt_err_t ad5791_init(rt_device_t dev)
rt_pin_mode(AD5791_RESET,PIN_MODE_OUTPUT); <br> rt_pin_write(AD5791_RESET,1); <br> rt_thread_delay(50); <br> rt_pin_write(AD5791_RESET,0); <br> rt_thread_delay(50); <br> rt_pin_write(AD5791_RESET,1);<br> rt_thread_delay(50);
ad5791_lock(&spi_ad5791_device);
status = ad5791_GetRegisterValue(AD5791_REG_CTRL);
rt_spi_send(spi_ad5791_device.rt_spi_device,registerWord,3);
rt_spi_transfer(device, send_buf, RT_NULL, length)
status = rt_spi_recv(spi_ad5791_device.rt_spi_device,receive_registerWord,3);
rt_spi_transfer(device, RT_NULL, recv_buf, length)
status = ad5791_SetRegisterValue(AD5791_REG_CTRL, newCtrl);
status = rt_spi_send(spi_ad5791_device.rt_spi_device, writeCommand, 3);
status = ad5791_GetRegisterValue(AD5791_REG_CTRL);
ad5791_unlock(&spi_ad5791_device);
spi_ad5791_device.da_device.open = ad5791_open;<br>
rt_err_t ad5791_open(rt_device_t dev, rt_uint16_t oflag)//空函数
spi_ad5791_device.da_device.close = ad5791_close;
static rt_err_t ad5791_close(rt_device_t dev)//空函数
spi_ad5791_device.da_device.read = ad5791_read;
ad5791_lock((struct spi_ad5791_device *)dev);
*((int*)buffer) = ad5791_GetRegisterValue(*((unsigned char*)pos));
ad5791_unlock((struct spi_ad5791_device *)dev);
spi_ad5791_device.da_device.write = ad5791_write;
uint32_t value = *((uint32_t*)buffer);
ad5791_lock((struct spi_ad5791_device *)dev);
value = value << (MAX_RESOLUTION - ad5791_chip_info[act_device].resolution);
status = ad5791_SetRegisterValue(AD5791_REG_DAC, value);
ad5791_unlock((struct spi_ad5791_device *)dev);
spi_ad5791_device.da_device.control = ad5791_control;
ad5791_lock((struct spi_ad5791_device *)dev);
status = ad5791_GetRegisterValue(AD5791_REG_CTRL);
status = ad5791_SetRegisterValue(AD5791_REG_CTRL, newCtrl);
ad5791_unlock((struct spi_ad5791_device *)dev);
spi_ad5791_device.da_device.user_data = RT_NULL;
rt_device_register(&spi_ad5791_device.da_device, ad5791_device_name,RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);