aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUri Shaked2020-02-03 22:34:30 +0200
committerUri Shaked2020-02-03 22:34:30 +0200
commit13a112968c5527b10b974489d3a2ec19c98736d9 (patch)
tree1c0d9819541d4d3e43846c1971ce3418581e763e
parenttest(twi): add master TWI receive test #10 (diff)
downloadavr8js-13a112968c5527b10b974489d3a2ec19c98736d9.tar.gz
avr8js-13a112968c5527b10b974489d3a2ec19c98736d9.tar.bz2
avr8js-13a112968c5527b10b974489d3a2ec19c98736d9.zip
feat(twi): proper interrupt support #10
-rw-r--r--src/twi.spec.ts11
-rw-r--r--src/twi.ts14
2 files changed, 20 insertions, 5 deletions
diff --git a/src/twi.spec.ts b/src/twi.spec.ts
index de7ceb8..369f22a 100644
--- a/src/twi.spec.ts
+++ b/src/twi.spec.ts
@@ -46,6 +46,17 @@ describe('TWI', () => {
expect(twi.sclFrequency).toEqual(400000);
});
+ it('should trigger data an interrupt if TWINT is set', () => {
+ const cpu = new CPU(new Uint16Array(1024));
+ const twi = new AVRTWI(cpu, twiConfig, FREQ_16MHZ);
+ cpu.writeData(0xbc, 0x81); // TWCR <- TWINT | TWIE
+ cpu.data[95] = 0x80; // SREG: I-------
+ twi.tick();
+ expect(cpu.pc).toEqual(0x30); // 2-wire Serial Interface Vector
+ expect(cpu.cycles).toEqual(2);
+ expect(cpu.data[0xbc] & 0x80).toEqual(0); // UCSR0A should clear TWINT
+ });
+
describe('Master mode', () => {
it('should call the startEvent handler when TWSTA bit is written 1', () => {
const cpu = new CPU(new Uint16Array(1024));
diff --git a/src/twi.ts b/src/twi.ts
index 027061f..fd0645b 100644
--- a/src/twi.ts
+++ b/src/twi.ts
@@ -1,6 +1,6 @@
-import { u8 } from './types';
import { CPU } from './cpu';
import { avrInterrupt } from './interrupt';
+import { u8 } from './types';
export interface TWIEventHandler {
start(repeated: boolean): void;
@@ -133,6 +133,13 @@ export class AVRTWI {
this.nextTick();
this.nextTick = null;
}
+ if (this.cpu.interruptsEnabled) {
+ const { TWCR, twiInterrupt } = this.config;
+ if (this.cpu.data[TWCR] & TWCR_TWIE && this.cpu.data[TWCR] & TWCR_TWINT) {
+ avrInterrupt(this.cpu, twiInterrupt);
+ this.cpu.data[TWCR] &= ~TWCR_TWINT;
+ }
+ }
}
get prescaler() {
@@ -186,11 +193,8 @@ export class AVRTWI {
}
private updateStatus(value: u8) {
- const { TWCR, TWSR, twiInterrupt } = this.config;
+ const { TWCR, TWSR } = this.config;
this.cpu.data[TWSR] = (this.cpu.data[TWSR] & ~TWSR_TWS_MASK) | value;
this.cpu.data[TWCR] |= TWCR_TWINT;
- if (this.cpu.interruptsEnabled && this.cpu.data[TWCR] & TWCR_TWIE) {
- avrInterrupt(this.cpu, twiInterrupt);
- }
}
}
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.