打印
[MSP430]

2553 硬件i2c sht30的driver

[复制链接]
1758|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuandaoxy|  楼主 | 2024-7-1 07:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chuandaoxy 于 2024-7-1 07:55 编辑

找到一个4133的驱动,结构很简单,但是如何移植到2553上有点不解i2c的ini大同小异略,下面3个函数,如何替换呢,4133使用了i2c中断方式
static void initWrite(void)
{
    UCB0CTLW0 |= UCTR;                         // UCTR=1 => Transmit Mode (R/W bit = 0)
    UCB0IFG &= ~UCTXIFG0;
    UCB0IE &= ~UCRXIE0;                        // disable Receive ready interrupt
    UCB0IE |= UCTXIE0 | UCSTTIE | UCSTPIE;     // enable Transmit ready interrupt
}
//**********************************************************************************************************************************************************
static void initRead(void)
{
    UCB0CTLW0 &= ~UCTR;                         // UCTR=0 => Receive Mode (R/W bit = 1)
    UCB0IFG &= ~(UCRXIFG0 | UCSTPIFG);
    UCB0IE &= ~(UCTXIE0 | UCSTTIE | UCSTPIE);   // disable Transmit ready interrupt
    UCB0IE |= UCRXIE0;                // enable Receive ready interrupt
}

void getMeasure(void)
{
    initWrite();
        UCB0CTLW0 |= UCTXSTT;                     // Send start. Transmit START condition in master mode.
        __bis_SR_register(LPM3_bits);             // Wait for TX interrupt flag
        UCB0TXBUF = SHT3X_MEASUREMENT_MSB;        // Send temperature command
        __bis_SR_register(LPM3_bits);
        UCB0TXBUF = SHT3X_MEASUREMENT_LSB;
        __bis_SR_register(LPM3_bits);
        UCB0CTLW0 |= UCTXSTP;
    __bis_SR_register(LPM3_bits);             // Ensure stop condition got sent

        initRead();                               // Change to receive
        UCB0CTLW0 |= UCTXSTT;
    UCB0CTLW0 |= UCTXSTP;                     // I2C stop condition
}

2553的I2C函数如下
来自这里
https://e2echina.ti.com/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/813036/msp430g2553-iic
/******************************************************************************************************
* 名 称:I2C_Tx_Init()
* 功 能:仅使能I2C的Tx中断
* 入口参数:无
* 出口参数:无
* 说 明:I2C通信只能半双工,只使能一个中断,工作可靠
* 范 例:无
******************************************************************************************************/
void I2C_Tx_Init()
{
__bic_SR_register(GIE);
while ((UCB0STAT & UCBUSY)||UCB0CTL1 & UCTXSTP); // 确保总线空闲
IE2 &= ~UCB0RXIE; //关闭Rx中断
I2C_State=TX_STATE;
IE2 |= UCB0TXIE; //允许Tx中断
__bis_SR_register(GIE); // 开总中断
}
/******************************************************************************************************
* 名 称:I2C_Rx_Init()
* 功 能:仅使能I2C的Rx中断
* 入口参数:无
* 出口参数:无
* 说 明:I2C通信只能半双工,只使能一个中断,工作可靠
* 范 例:无
******************************************************************************************************/
void I2C_Rx_Init()
{
__bic_SR_register(GIE);
while ((UCB0STAT & UCBUSY)||UCB0CTL1 & UCTXSTP); // 确保总线空闲
IE2 &= ~UCB0TXIE; // 关闭Rx中断
I2C_State=RX_STATE;
IE2 |= UCB0RXIE; // 允许Tx中断
__bis_SR_register(GIE); // 开总中
}

/******************************************************************************************************
* 名 称:I2C_TxFrame()
* 功 能:新发送1帧数据
* 入口参数:*p_Tx:待发送数据的首地址
* num:待发送数据的个数
* 出口参数:0:失败;1:成功
* 说 明:只有不BUSY且STOP已复位的情况下才允许发送新的帧
* 范 例:无
******************************************************************************************************/
unsigned char I2C_TxFrame(unsigned char *p_Tx,unsigned char num)
{
if ((UCB0STAT & UCBUSY)||(UCB0CTL1 & UCTXSTP)) return(0);
pTxData = (unsigned char *)p_Tx; // 更新数据指针
TxByteCnt = num; // 更新剩余发送数据个数
UCB0CTL1 |= UCTR + UCTXSTT; // I2C Tx位, 软件start condition
__bis_SR_register(CPUOFF+GIE);
return(1);
}
如何替代4133的代码里void getMeasure(void)呢?
熟悉的专家说来听听







msp430-sht3x-sensors-main.zip

7.46 KB

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

855

主题

1044

帖子

4

粉丝