42 #include "isr_compat.h"
44 signed char tx_byte_ctr, rx_byte_ctr;
45 unsigned char rx_buf[2];
46 unsigned char *tx_buf_ptr;
47 unsigned char *rx_buf_ptr;
48 unsigned char receive_data;
49 unsigned char transmit_data1;
50 unsigned char transmit_data2;
51 unsigned char prescale_lsb = I2C_PRESC_Z1_LSB;
52 unsigned char prescale_msb = I2C_PRESC_Z1_MSB;
53 volatile unsigned int i;
59 i2c_setrate(uint8_t p_lsb, uint8_t p_msb)
68 i2c_receiveinit(uint8_t slave_address)
71 UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;
72 UCB1CTL1 = UCSSEL_2 | UCSWRST;
73 UCB1BR0 = prescale_lsb;
74 UCB1BR1 = prescale_msb;
75 UCB1I2CSA = slave_address;
79 #if I2C_RX_WITH_INTERRUPT
87 i2c_transmitinit(uint8_t slave_address)
90 UCB1CTL0 |= (UCMST | UCMODE_3 | UCSYNC);
91 UCB1CTL1 = UCSSEL_2 + UCSWRST;
92 UCB1BR0 = prescale_lsb;
93 UCB1BR1 = prescale_msb;
94 UCB1I2CSA = slave_address;
103 static volatile uint8_t rx_byte_tot = 0;
105 i2c_receive_n(uint8_t byte_ctr, uint8_t *rx_buf)
108 rx_byte_tot = byte_ctr;
109 rx_byte_ctr = byte_ctr;
112 while((UCB1CTL1 & UCTXSTT) || (UCB1STAT & UCNACKIFG))
113 PRINTFDEBUG(
"____ UCTXSTT not clear OR NACK received\n");
115 #if I2C_RX_WITH_INTERRUPT
116 PRINTFDEBUG(
" RX Interrupts: YES \n");
119 if(rx_byte_tot == 1) {
122 while(UCB1CTL1 & UCTXSTT)
123 PRINTFDEBUG(
"____ STT clear wait\n");
132 uint8_t n_received = 0;
134 PRINTFDEBUG(
" RX Interrupts: NO \n");
138 while(rx_byte_ctr > 0) {
139 if(UC1IFG & UCB1RXIFG) {
140 rx_buf[rx_byte_tot - rx_byte_ctr] = UCB1RXBUF;
142 UC1IFG &= ~UCB1RXIFG;
156 return UCB1STAT & UCBBUSY;
165 I2C_PxSEL |= (I2C_SDA | I2C_SCL);
166 I2C_PxSEL2 |= (I2C_SDA | I2C_SCL);
167 I2C_PxDIR |= I2C_SCL;
168 I2C_PxDIR &= ~I2C_SDA;
169 I2C_PxREN |= (I2C_SDA | I2C_SCL);
170 I2C_PxOUT |= (I2C_SDA | I2C_SCL);
175 I2C_PxSEL &= ~(I2C_SDA | I2C_SCL);
176 I2C_PxSEL2 &= ~(I2C_SDA | I2C_SCL);
177 I2C_PxREN &= ~(I2C_SDA | I2C_SCL);
178 I2C_PxOUT &= ~(I2C_SDA | I2C_SCL);
183 static volatile uint8_t tx_byte_tot = 0;
185 i2c_transmit_n(uint8_t byte_ctr, uint8_t *tx_buf)
187 tx_byte_tot = byte_ctr;
188 tx_byte_ctr = byte_ctr;
190 UCB1CTL1 |= UCTR + UCTXSTT;
193 ISR(USCIAB1TX, i2c_tx_interrupt)
196 if(UC1IFG & UCB1TXIFG) {
197 if(tx_byte_ctr == 0) {
199 UC1IFG &= ~UCB1TXIFG;
201 UCB1TXBUF = tx_buf_ptr[tx_byte_tot - tx_byte_ctr];
206 #if I2C_RX_WITH_INTERRUPT
207 else if(UC1IFG & UCB1RXIFG) {
208 rx_buf_ptr[rx_byte_tot - rx_byte_ctr] = UCB1RXBUF;
210 if(rx_byte_ctr == 1) {
212 if(rx_byte_tot != 1) {
215 UC1IFG &= ~UCB1RXIFG;
221 ISR(USCIAB1RX, i2c_rx_interrupt)
223 if(UCB1STAT & UCNACKIFG) {
224 PRINTFDEBUG(
"!!! NACK received in RX\n");
226 UCB1STAT &= ~UCNACKIFG;
void i2c_enable(void)
Configure serial controller in I2C mode and set I2C speed.
void i2c_disable(void)
Configure serial controller in disabled mode.
I2C communication device driver header file for Zolertia Z1 sensor node.