我的问题是关于微控制器开发的。我开始将 PCA9685 连接到 nRF52 DK 并遇到了一个奇怪的问题。初始化 PWM 模块时,它不起作用。初始化需要将寄存器设置为某些值,这并不复杂。坐了一会儿后,我设法使其正常工作。[链接到工作代码][1] 代码看起来很糟糕,但它可以工作
我遇到了以下问题:
void pca9685_write_u8 (uint8_t reg,uint8_t val)
{
uint8_t buff[2] = {reg,val};
nrf_drv_twi_tx(&m_pcah.twi_handle,m_pcah.device_address,buff, 2, false);
}
我认为不值得解释该方法的作用。我经常使用它来初始化 PWM 驱动程序。但是如果我复制函数的主体并在它使用的地方替换它,那么一切都会停止工作。例如:
void pca9685_sleep(void)
{
// Read the current state of the mode 1 register.
uint8_t mode1_reg;
pca9685_read_u8( PCA9685_REGISTER_MODE1, &mode1_reg);
// Don't write the restart bit back and set the sleep bit.
PCA9685_CLEAR_BIT_MASK(mode1_reg, PCA9685_REGISTER_MODE1_RESTART);
PCA9685_SET_BIT_MASK(mode1_reg, PCA9685_REGISTER_MODE1_SLEEP);
//pca9685_write_u8( PCA9685_REGISTER_MODE1, mode1_reg);
uint8_t buff[2] = {PCA9685_REGISTER_MODE1, mode1_reg};
nrf_drv_twi_tx(&m_pcah.twi_handle,m_pcah.device_address,buff, 2, false);
}
这还不是全部。但这是我唯一需要经过反复试验的事情。
void pca9685_write_u8 (pca9685_handle_t *m_handle,uint8_t reg,uint8_t val)
{
uint8_t buff[2] = {reg,val};
nrf_drv_twi_tx(&m_handle->twi_handle,m_handle->device_address,buff, 2, false);
}
但它没有用这是我第一次遇到这样的事情。
使用的工具:
- nRF52-DK,
- Segger 嵌入式工作室
- PCA9685
我也用类似的方式收集了上面的发送函数[1]:https ://github.com/Nursultan-Salikhov/PCA_9686-with-nRF52/blob/main/pca9685.c