传媒学子 发表于 2021-5-23 19:22

[家庭智慧照明控制与室内环境监测系统]--4. 【RSL10】I2C控制PCA9685 PWM输出

<p>最近2个星期都在搞PWM输出的问题,主要是对于ARM的CMSIS库的熟悉和移植;整个过程中遇到了很多问题,就一些比较经典的问题,给大家分享一下;</p>

<p>1.首先,我们安装完RSL10的pack后,可以选择i2c_cmsis_drive例程</p>

<p></p>

<p>2. 选择完,该例程后,编译是无法通过的,因为RSL10的pack中并没有包含 ARM CMSIS PACK;而该例程中I2C是采用的ARM Cortex M3的I2C外设,因此需要安装 ARM CMSIS PACK;</p>

<p><a href="https://developer.arm.com/tools-and-software/embedded/cmsis">https://developer.arm.com/tools-and-software/embedded/cmsis</a>&nbsp;去该网站,然后跳转到github上下载最新的pack, 然后安装到ON 开发环境中;即可正常编译;</p>

<p></p>

<p>3. 移植pca9685</p>

<p>&nbsp; &nbsp; 应该注意,</p>

<p>3.1 I2C从机地址:如果PCA9685的I2C地址是0x40, 那么在arm cmsis库中,也应该是0x40, 而不是0x80;</p>

<p>3.2 采用arm cmsis库的I2C驱动时,不需要我们去添加R/W bit,驱动会自动添加;</p>

<pre>
<code class="language-cpp">bool pca9685_write_u8(pca9685_handle_t *handle, uint8_t address, uint8_t value)
{
        uint8_t data[] = {address, value};
        //return i2c-&gt;MasterTransmit(handle-&gt;device_address, data, 2, false) == 0;
        i2c-&gt;MasterTransmit(handle-&gt;device_address, data, 2, false);
        while (i2c-&gt;GetStatus().busy);
        return true;
}

bool pca9685_write_data(pca9685_handle_t *handle, uint8_t address, uint8_t *data, size_t length)
{
    if (length == 0 || length &gt; 4) {
      return false;
    }

    uint8_t transfer;
    transfer = address;

    memcpy(&amp;transfer, data, length);
    i2c-&gt;MasterTransmit(handle-&gt;device_address, transfer, length + 1, false);
    while (i2c-&gt;GetStatus().busy);
    return true;
    //return i2c-&gt;MasterTransmit(handle-&gt;device_address, transfer, length + 1, false) == 0;
}

bool pca9685_read_u8(pca9685_handle_t *handle, uint8_t address, uint8_t *dest)
{
        i2c-&gt;MasterTransmit(handle-&gt;device_address, &amp;address, 1, false);
        while (i2c-&gt;GetStatus().busy);
        i2c-&gt;MasterReceive(handle-&gt;device_address, dest, 1, false);
        while (i2c-&gt;GetStatus().busy);
        return true;
//        if ( i2c-&gt;MasterTransmit(handle-&gt;device_address, &amp;address, 1, false) != 0) {
//                return false;
//        }
//
//        return i2c-&gt;MasterReceive(handle-&gt;device_address, dest, 1, false) == 0;
}</code></pre>

<p>4. PWM波形输出</p>

<p></p>

<p>后续,计划学习BLE 协议,这个之前没有接触过,个人觉得还是比较有挑战的..</p>

Jacktang 发表于 2021-5-23 21:38

<p>用arm cmsis库的I2C驱动时,不需要我们去添加R/W bit,驱动会自动添加</p>

<p>这个马住,</p>

<p>不然又是坑</p>

annysky2012 发表于 2021-5-24 08:51

<p>先移植一个模板工程,编译没有问题在再继续后续操作。否知有很多问题的,找起来很麻烦</p>

hehung 发表于 2021-5-28 14:41

<p>厉害,IIC的代码能发一下嘛?我调试这块一直返回未完成故障</p>

传媒学子 发表于 2021-5-30 19:15

hehung 发表于 2021-5-28 14:41
厉害,IIC的代码能发一下嘛?我调试这块一直返回未完成故障

<p><a href="javascript:;" id="attachname541320" isimage="0" onclick="insertAttachTag('541320');doane(event);" title="i2c_cmsis_driver.rar
上传日期: 2021-5-30 19:15
文件大小: 4.07 MB">i2c_cmsis_driver.rar</a></p>

hehung 发表于 2021-5-31 14:15

传媒学子 发表于 2021-5-30 19:15
i2c_cmsis_driver.rar

<p>谢谢[点赞]</p>

w494143467 发表于 2021-6-9 16:37

<p>原来这个开发这么困难,IIC通信估计我也用得到!</p>
页: [1]
查看完整版本: [家庭智慧照明控制与室内环境监测系统]--4. 【RSL10】I2C控制PCA9685 PWM输出