使用MPLAB的MCC配置I2C和ADC

时间:2017-10-23 11:44:56

标签: pic i2c mplab adc texas-instruments

我正在尝试使用PIC16LF1554通过I2C与BQ24259进行通信。该设备的第7个寄存器有一个可用于关闭电池的位。我使用Mplab的MCC配置I2C设置。使用头文件中的示例代码我写了一个类似的功能。

这是代码的相关片段

    #define RETRY_MAX       100
    #define ON              0x4B   //register 7 toggle 5th bit to turn ON/OFF
    #define OFF             0x6B
    I2C_MESSAGE_STATUS status;

    uint16_t        timeOut;
    uint8_t         writeBuffer[1];                // writeBuffer[0] = 07, writeBuffer[1] = data 01001011b(on) 01101011b(off)
    uint8_t         stat;
    uint16_t        address = (0x6B/2) ;           //Bit shifting to the write, and having '0' for write opertaoin, at MSB

uint8_t bat_fet(uint8_t val){
    writeBuffer[0] = 7;                      //slave's seventh register
    writeBuffer[1] = val;
    timeOut=0;
    while(status != I2C_MESSAGE_FAIL){
        I2C_MasterWrite( writeBuffer,        // address of data to be sent
                         2,                  // number of data bytes
                         address,            // address of the peripheral
                         &status);           // address of status register

        while(status == I2C_MESSAGE_PENDING);

        if(status == I2C_MESSAGE_COMPLETE){
            return 1;
            break;
        }
        if(timeOut == RETRY_MAX){
            return 0;

            break; 
        }
        else
            timeOut++;
    }
    if(status == I2C_MESSAGE_FAIL)
        return 0;

}

但它不起作用,没有任何反应,有时控制器只是冻结,大多数它继续工作。我已将LED连接到未使用的IO引脚,并在程序返回1时对其进行编程以打开,然后将其打开。但电池仍然存在。

同样,我正在尝试使用pic的ADC 1来检查电池电压,

这是代码,

uint16_t check_bat_voltage(){

    uint16_t bat_v;

    ADC1_StartConversion(01011); //i am using Channel AN11, but no matter what variation of channel and AN11 i passed, it just wouldn't recognize. so i just pass the 5 bit values of the ADCON1 register.

    while(ADC1_IsConversionDone());

    bat_v = ADC1_GetConversionResult();  

//digital value = [analog voltage / (vref+ - vref-)] * 1024 
 //analog value minimum = 2.5/2, voltage divider network
 //vref+ 5
 //vref- 0
 // 1.25/5 * 1024 = 256
    return bat_v;
}

但是没有任何反应。 有人可以评论一下吗?我只是卡住了。感谢。

我也可以附上MCC的屏幕截图,也许我没有正确配置外围设备。

P.S。我在main()中初始化两个模块。

2 个答案:

答案 0 :(得分:0)

我相信您的问题是您在循环之前忘记将status初始化为I2C_MESSAGE_FAIL以外的其他内容(我假设您的全局stat是拼写错误 - 它应该是status)。

除非使用__attribute__((persistent))(XC16编译器 - 不确定XC8)将变量声明为持久变量,否则启动代码会将所有全局变量初始化为零。因为我猜测常量I2C_MESSAGE_FAIL不为零,这意味着你的循环永远不会执行。

编译器可能会在初始化之前向您发出有关使用变量的警告。

请尝试使用do {} while循环。

答案 1 :(得分:0)

也许是你声明中的拼写错误?尝试改变:

uint8_t    writeBuffer[1];

uint8_t    writeBuffer[2];

建议确定scl和sda行的范围,并检查当led开启时实际发送的内容。