int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1OUT = BIT4;
P1REN |= BIT4; // P1.4 上拉电阻(P1OUT决定)
P1DIR = BIT0; // P1.0 输出
P1OUT |= BIT0;
USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE;
/*
* USIPE7 SPI输入模式,I2C开漏输出
* USIPE7 SPI输出模式,I2C开漏输出
* USIPE5 SPI从机输入,I2C,SPI主机输出
* USILSB LSB优先
* USIMST 主机模式
* USIGE 输出锁存
* USIOE 数据输出使能
* USISWRST 软复位
*/
USICTL1 |= USIIE;
/*
* USICKPH SCLK的上升沿捕捉,下降沿发送.
* USII2C I2C使能
* USISTTIE 传输开始时中断
* USIIE 中断开启
* USIAL 关闭仲裁
* USISTP 启用停止标记
* USISTTIFG 收到开始信号时候的请求中断标记.
* USIIFG USI计数器中断标记
*/
USICKCTL = USIDIV_4 + USISSEL_2;
/*
* USIDIV 分频器1,2,4,8,16,32,64,128
* USISSEL 时钟源SCLK(SPI无效),ACLK,SMCLK,[NULL],USISWCLK,TACCR0,TACCR1,[NULL]
* USICKPL 空闲时时钟信号为高电平
* USISWCLK 输入时时钟信号为高电平
*/
USICTL0 &= ~USISWRST; //USI操作软复位,数据立即需要准备.
P1OUT &= ~BIT0;
USISRL = char_ch++; //低8位数据,其实可以存16位,包含USISRH + USISRL (USI16B = 1)
USICNT = 0x08;
/*
* USISCLREL SCL保持低电平,即使USIIFG置位
* USI16B 16位模式
* USIIFGCC USIIFG不自动清零
* USICNT 设置发送位数0-F(1-16位)
*/
_BIS_SR(LPM0_bits + GIE); // LPM0模式,总中断开启
while(1){
//立即发送下一次数据
P1OUT &= ~BIT0;
USISRL = char_ch++;
USICNT = 0x08;
}
}
// USI 中断服务路由
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
/*
* 两个不同的中断服务,需要分开判断.
* USIIFG 数据收发完成
* USISTTIFG 请求接收
*/
if(USICTL1 & USIIFG){
//这是USIIFG中断服务
P1OUT |= BIT0;
USICNT = 0x08; //这里打断点,发现单步后USICNT没有改变
USICTL1 &= ~USIIFG; //永远循环在这里
}else{
//这是USISTTIFG中断服务
char_ch = USISRL;
USICTL1 &= ~USISTTIFG ;
}
} |