赛元TWI从机通讯示例代码
时间: 2023-09-03 14:10:37 浏览: 87
以下是赛元TWI从机通讯示例代码:
```c
#include <avr/io.h>
#include <avr/interrupt.h>
#define SLAVE_ADDRESS 0x20
volatile uint8_t twi_buf[16];
volatile uint8_t twi_buf_len = 0;
ISR(TWI_vect) {
uint8_t twi_status = TWSR & 0xF8;
switch (twi_status) {
case TW_ST_SLA_ACK:
case TW_ST_DATA_ACK:
if (twi_buf_len > 0) {
TWDR = twi_buf[0];
twi_buf_len--;
for (uint8_t i = 0; i < twi_buf_len; i++) {
twi_buf[i] = twi_buf[i + 1];
}
} else {
TWDR = 0xFF;
}
break;
case TW_SR_DATA_ACK:
if (twi_buf_len < sizeof(twi_buf)) {
twi_buf[twi_buf_len] = TWDR;
twi_buf_len++;
}
break;
default:
break;
}
TWCR |= (1 << TWINT);
}
int main(void) {
TWAR = (SLAVE_ADDRESS << 1);
TWCR = (1 << TWEN) | (1 << TWIE) | (1 << TWEA);
sei();
while (1) {
}
}
```
这个代码实现了一个简单的从机 TWI (I2C) 设备。主机可以向从机发送数据,从机将会存储这些数据,然后主机可以读取存储的数据。
从机的地址是 0x20。TWI 中断服务程序处理从机接收和发送数据。在接收数据时,从机将收到的数据存储在 twi_buf 数组中,并在主机请求时按顺序发送。在发送数据时,从机从 twi_buf 数组中获取数据并发送给主机。如果 twi_buf 数组为空,则从机发送 0xFF。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)