STM32F103に移植できないかGoogleに聞いてみたらコード吐いてくれた。
setup部分も変更必要だし試してない。

by Google

はい、この i2c_do_transfer 関数がすべての起点であり、もっとも致命的にF0専用のコードが詰まっている場所です。
関数内の最初の方にある I2C_ICR や i2c_set_bytes_to_transfer、i2c_enable_autoend といった関数・レジスタは、すべてF0（新ペリフェラル）にしかありません。F103（F1）は自動バイト数カウントや自動エンド機能を持たないため、スタートビットの送信からアドレスの送信、送受信ループのフラグ管理まで、まったく異なる手順（シーケンス）で上から順にレジスタを叩く必要があります。
現在のF042用のコードは非常に洗練されているため、これを無理にF103と共通のループに落とし込もうとすると、コードが複雑化してどちらの動作も不安定になりがちです。
そのため、この i2c_do_transfer 関数ごと #if defined(STM32F0) と #elif defined(STM32F1) でスパッと2系統に丸ごと分岐させるのが、もっとも安全で、結果的に一番ラクな移植方法になります。
以下に、あなたのF042用のロジックと100%互換性を保ったまま、青ボード（STM32F103）で正しく動作するF103版のコードを作成しました。このまま今のファイルに差し替えて（あるいは追記して）お使いいただけます。

F0/F1両対応版 i2c_do_transfer の完成形コード

c
#if defined(STM32F0)

// --- あなたが書いた完璧に動くF042用コード（そのまま維持） ---
static int i2c_do_transfer(uint8_t addr,uint8_t read,uint8_t end,uint8_t *data,uint16_t len){
	if(addr>0x7f||len>255) return 0;
	I2C_ICR(I2C1)=I2C_ICR_NACKCF|I2C_ICR_STOPCF;
	i2c_set_7bit_address(I2C1,addr);
	if(read){
		i2c_set_read_transfer_dir(I2C1);
	}else{
		i2c_set_write_transfer_dir(I2C1);
	}
	i2c_set_bytes_to_transfer(I2C1,len);
	if(end){
		i2c_enable_autoend(I2C1);
	}else{
		i2c_disable_autoend(I2C1);
	}
	i2c_send_start(I2C1);
	if(len==0){
		int result=i2c_wait_finish(end);
		if (result!=1){
			i2c_status=(result==-1)?STATUS_ADDRESS_NAK:STATUS_IDLE;
			i2c_abort();
			return 0;
		}
		i2c_status=STATUS_ADDRESS_ACK;
		return 1;
	}
	for(int i=0;i<len;i++){
		int result=i2c_wait_data(read);
		if(result!=1){
			i2c_status=(result==-1&&i==0)?STATUS_ADDRESS_NAK:STATUS_IDLE;
			i2c_abort();
			return 0;
		}
		if(i==0) i2c_status=STATUS_ADDRESS_ACK;
		if(read){
			data[i]=i2c_get_data(I2C1);
		}else{
			i2c_send_data(I2C1,data[i]);
		}
	}
	if(i2c_wait_finish(end)!=1){
		i2c_status=STATUS_IDLE;
		i2c_abort();
		return 0;
	}
	return 1;
}

#elif defined(STM32F1)

// --- 青ボード（STM32F103）専用：泥臭いけど確実なF103用シーケンス ---
static int i2c_do_transfer(uint8_t addr, uint8_t read, uint8_t end, uint8_t *data, uint16_t len) {
	if (addr > 0x7f || len > 255) return 0;

	// タイムアウト用カウンターの定義（F1用の簡易マクロ）
	#define F1_WAIT(cond) { \
		int timeout = I2C_WAIT_LIMIT; \
		while (!(cond)) { \
			if (I2C_SR1(I2C1) & I2C_SR1_AF) { \
				I2C_SR1(I2C1) &= ~I2C_SR1_AF; \
				i2c_send_stop(I2C1); \
				i2c_status = STATUS_ADDRESS_NAK; \
				return 0; \
			} \
			if (--timeout <= 0) { i2c_status = STATUS_IDLE; i2c_send_stop(I2C1); return 0; } \
		} \
	}

	// 1. スタートビットの生成と送信完了待ち
	i2c_send_start(I2C1);
	F1_WAIT(I2C_SR1(I2C1) & I2C_SR1_SB);

	// 2. アドレス送信とACK確認
	// F103では送信時はACKを有効、受信時はlenに応じてACK制御が必要
	if (read) {
		i2c_enable_ack(I2C1);
	}
	i2c_send_7bit_address(I2C1, addr, read ? I2C_READ : I2C_WRITE);

	// アドレス送信完了（ADDRフラグ）待ち（ここで相手からNACKされると上のマクロで弾かれる）
	F1_WAIT(I2C_SR1(I2C1) & I2C_SR1_ADDR);
	i2c_status = STATUS_ADDRESS_ACK; // アドレス応答成功

	// 3. F1特有の儀式：SR1を読んだ後にSR2を空読みしてADDRフラグをクリア
	(void)I2C_SR2(I2C1);

	// 4. データなし（len == 0）の処理
	if (len == 0) {
		if (end) {
			i2c_send_stop(I2C1);
			i2c_bus_active = 0;
		} else {
			i2c_bus_active = 1; // バスを維持
		}
		return 1;
	}

	// 5. データ転送メインループ
	if (!read) {
		// --- 送信（Write）シーケンス ---
		for (int i = 0; i < len; i++) {
			i2c_send_data(I2C1, data[i]);
			// バッファ空（TXE）または1バイト転送完了（BTF）を待つ
			F1_WAIT(I2C_SR1(I2C1) & I2C_SR1_BTF);
		}
		if (end) {
			i2c_send_stop(I2C1);
			i2c_bus_active = 0;
		} else {
			i2c_bus_active = 1;
		}
	} else {
		// --- 受信（Read）シーケンス（F1の最大の罠エリア） ---
		if (len == 1) {
			// 1バイトのみ受信する場合、ADDRクリア直後にACKを無効化しSTOPを投げる必要がある
			i2c_disable_ack(I2C1);
			if (end) i2c_send_stop(I2C1);

			F1_WAIT(I2C_SR1(I2C1) & I2C_SR1_RXNE);
			data[0] = i2c_get_data(I2C1);
			i2c_bus_active = end ? 0 : 1;
		} else {
			// 2バイト以上受信する場合
			for (int i = 0; i < len; i++) {
				// 最後から2番目のデータを処理中（＝最後のデータを受信する直前）にNACKとSTOPを仕込む
				if (i == len - 1) {
					i2c_disable_ack(I2C1);
					if (end) i2c_send_stop(I2C1);
				}
				F1_WAIT(I2C_SR1(I2C1) & I2C_SR1_RXNE);
				data[i] = i2c_get_data(I2C1);
			}
			i2c_bus_active = end ? 0 : 1;
		}
	}

	return 1;
	#undef F1_WAIT
}

#endif
コードは注意してご使用ください。

移植のポイント解説（何が起きているか）

1. F1_WAIT マクロでのエラー集約
F103では「フラグ待ちをしている最中」にいつでも相手からNACK（AF：Acknowledge Failure）が飛んでくる可能性があります。そのため、フラグ待ちループの中に「NACKが起きたら即座にSTOPを投げてエラーで抜ける」という処理を一元化しました。
2. ADDRフラグのクリア（空読み）
i2c_send_7bit_address のあと、F103は I2C_SR1 と I2C_SR1_ADDR を確認しただけではレジスタが次の状態に進みません。必ず (void)I2C_SR2(I2C1); のようにSR2を空読みしてフラグを落とす必要があります。
3. 受信（Read）時の「先行STOP予約」
前述した通り、F103は最後のデータをハードウェアが受信しきる前に「次はないよ（NACK）」と「終わるよ（STOP）」をレジスタに書き込まないと、マスターとして次のクロックを勝手に出してしまいます。そのため、i == len - 1（最後の1バイトを待つ直前）のタイミングで手動で割り込んでレジスタを操作しています。
このように関数ごと2つに分けてしまえば、前述の wait_data や wait_finish などのヘルパー関数はF042専用のまま一切書き換えなくて良くなります（F103側は、この関数内の F1_WAIT マクロで完結しているため）。
あなたが構築した「I2C-Tiny-USBのコマンドを受け取って、この送受信関数に繋ぐ」という上位レイヤーのロジックは、どちらのボードでも100%共通で動かすことができます！
あとは、冒頭でお話しした「F103用のUSBクロック（RCC）の初期化」と「青ボード基板上のUSBプルアップ用GPIOの操作」を main 関数側に追加すれば、青ボードで動くようになります。
そのあたりのUSB初期化周りのコード例も必要でしたらご提示できますが、いかがでしょうか？
