런치 패드 보드에 연결된 버스 해적에서 감지 가능한 비트를 얻으려고합니다 (Sparkfun 케이블 사용 : 주황색은 P1.6, 노랑에서 P1.5로 이동합니다. MOSI 및 MISO가 혼동되지 않는 한 정확해야합니다. ...). 버스 해적을 사용하여 아무것도 모니터링하기 때문에 CS를 연결하지 않았습니다.
버스 해적은 SPI, 125KHz, 클록 극성 유휴 낮음, 출력 클록 에지 활성-유휴 상태, 입력 샘플 위상 중간, / CS에 대해 설정되며 출력은 정상입니다.
런치 패드에는 외부 크리스탈이없는 MSP430G2231이 있습니다. Code Composer Studio를 사용하면 다음이 있습니다.
#include "msp430g2231.h"
volatile unsigned char value=0;
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
value+=1;
USISRL=value;
USICNT=8;
}
void main(void){
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ;
BCSCTL2 &= ~(DIVS_3);
USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE;
USICTL1 |= USIIE;
USICKCTL = USIDIV_3 + USISSEL_2;
USICTL0 &= ~USISWRST;
USISRL=value;
USICNT = 8;
__bis_SR_register(LPM0_bits+ GIE);
}
이것의 대부분은 다양한 샘플에서 함께 모여 있습니다. 데이터 시트를 많이 읽은 후에는 USI 클럭이 125KHz (1MHz의 SMCLK를 8로 나눈 값)에서 실행되도록 설정된 것처럼 보이지만이를 측정 할 범위는 없습니다.
달릴 때, 나는 버스 해적에서 본질적으로 쓰레기를 얻는다. P는 USI 인터럽트 벡터의 첫 번째 줄에 중단 점을 놓고 세 번 통과 했으므로 버스 해적에서 0, 1, 2를 얻었습니다.
0x00(0x00)0x00(0x00)][0x40(0x00)]
그리고 무료로 실행 시키면 다음과 같은 것들을 얻습니다.
[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]
여전히 내가 기대하는 것과 닮지 않습니다.
나는 대부분의 저녁을 칩에 대한 사용자 안내서를 보냈는데 여전히 충격을 받았다.
이 글을 쓰는 동안, 나는 Bus Pirate를 로직 애널라이저 (LogicSniffer 사용)로 사용할 수 있다는 것을 알게되었습니다. 그리고에 0x55를 작성하는 프로그램 수정 USISRL
및 변경 USIDIV
에 USIDIV_4
좀 더 천천히 일들을하고, 여기에 결과는 다음과 같습니다
클럭 신호는 양호 해 보인다. LogicSniffer는 약 285KHz이고 MOSI는 ... 특별하다고보고했다. 0x55를 작성하고 있기 때문에 멋진 패턴을 기대할 수 있습니다.
아무도 내가 잘못하고있는 것에 대해 어떤 생각을 가지고 있습니까? 불량 칩? 다른 것?
편집 : 좋아, 내 부분에 약간의 관용구. 인터럽트에서 SPI에 쓰여지는 값을 변경하지 않았습니다. 이렇게하면 예상되는 패턴이됩니다.
그러나 증가하는 바이트를 쓰려고하면 가비지가 발생합니다.
그래서, 나는 생각만큼 큰 문제가 아닌 여전히 문제가 있습니다 ...
편집 2 : 아래 의견 덕분에 이전에 연결되지 않은 Bus Pirate 케이블의 접지선을 전원 공급 장치 (Sparkfun의 브레드 보드 전원 공급 장치)의 접지에 연결했습니다. 이전에는 그들이 공유 한 가장 가까운 곳은 내가이 모든 장비를 끊고있는 USB 허브로 돌아갔습니다.
이는 카운터 프로그램을 실행할 때 MOSI의 결함을 제거했으며 LogicSniffer는 이제 자체적으로 바이트를 올바르게 디코딩 할 수 있습니다.
모니터 모드의 버스 해적은 여전히 이상한 결과를보고합니다.
[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]
쓰기 끝을 더 잘 감지 할 수있는 것처럼 보이지만 (대괄호가 구분하는 것으로 가정하고 있음) 데이터는 여전히 해독되어 있습니다. 파형이 더 좋아 보이는 것에 대해 걱정하지 않지만 Bus Pirate가 왜 혼란스러워하는지 아는 것이 여전히 좋습니다.
while(1);
main () 끝에서 종료하거나 임의의 작업을 수행하는 것을 보지 못합니다 .